]> git.ipfire.org Git - people/pmueller/ipfire-3.x.git/commitdiff
Drop support for iSCSI
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 10 Feb 2018 14:48:34 +0000 (14:48 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 10 Feb 2018 14:48:34 +0000 (14:48 +0000)
We used to use this for our own builders, but SANs are dead.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
34 files changed:
iscsi-initiator-utils/iscsi-initiator-utils.nm [deleted file]
iscsi-initiator-utils/iscsi.tmpfiles [deleted file]
iscsi-initiator-utils/iscsi_mark_root_nodes [deleted file]
iscsi-initiator-utils/patches/0001-iscsid-fix-iscsid-segfault-during-qla4xxx-login.patch [deleted file]
iscsi-initiator-utils/patches/0002-ISCSISTART-Bring-up-the-corresponding-network-interf.patch [deleted file]
iscsi-initiator-utils/patches/0003-iscsi-tools-fix-compile-error-when-OFFLOAD_BOOT_SUPP.patch [deleted file]
iscsi-initiator-utils/patches/0004-ISCSID-Passing-more-net-params-from-ibft-to-iface.patch [deleted file]
iscsi-initiator-utils/patches/0005-iscsi-tools-Convert-r-argument-to-an-integer-before-.patch [deleted file]
iscsi-initiator-utils/patches/0006-Update-README-for-removal-of-DBM-requirement.patch [deleted file]
iscsi-initiator-utils/patches/0007-iscsid-iscsiadm-fix-abstract-socket-length-in-bind-c.patch [deleted file]
iscsi-initiator-utils/patches/0008-iscsid-implement-systemd-compatible-socket-activatio.patch [deleted file]
iscsi-initiator-utils/patches/0009-iscsid-add-example-unit-files-for-systemd.patch [deleted file]
iscsi-initiator-utils/patches/0010-iscsi-tools-fix-get_random_bytes-error-handling.patch [deleted file]
iscsi-initiator-utils/patches/0031-iscsid-add-initrd-option-to-set-run-from-initrd-hint.patch [deleted file]
iscsi-initiator-utils/patches/0032-iscsiadm-iscsid-newroot-command-to-survive-switch_ro.patch [deleted file]
iscsi-initiator-utils/patches/0033-iscsiadm-param-parsing-for-advanced-node-creation.patch [deleted file]
iscsi-initiator-utils/patches/0034-update-systemd-service-files-add-iscsi.service-for-s.patch [deleted file]
iscsi-initiator-utils/patches/0051-update-initscripts-and-docs.patch [deleted file]
iscsi-initiator-utils/patches/0052-use-var-for-config.patch [deleted file]
iscsi-initiator-utils/patches/0053-use-red-hat-for-name.patch [deleted file]
iscsi-initiator-utils/patches/0054-add-libiscsi.patch [deleted file]
iscsi-initiator-utils/patches/0055-dont-use-static.patch [deleted file]
iscsi-initiator-utils/patches/0056-remove-the-offload-boot-supported-ifdef.patch [deleted file]
iscsi-initiator-utils/patches/0057-iscsid-iscsiuio-ipc-interface.patch [deleted file]
iscsi-initiator-utils/patches/0058-iscsiuio-IPC-newroot-command.patch [deleted file]
iscsi-initiator-utils/patches/0059-iscsiuio-systemd-unit-files.patch [deleted file]
iscsi-initiator-utils/patches/0060-use-systemctl-to-start-iscsid.patch [deleted file]
iscsi-initiator-utils/patches/0061-resolve-565245-multilib-issues-caused-by-doxygen.patch [deleted file]
iscsi-initiator-utils/patches/0062-Don-t-check-for-autostart-sessions-if-iscsi-is-not-u.patch [deleted file]
iscsi-initiator-utils/patches/0063-fix-order-of-setting-uid-gid-and-drop-supplementary-.patch [deleted file]
iscsi-initiator-utils/patches/0099-use-Red-Hat-version-string-to-match-RPM-package-vers.patch [deleted file]
iscsi-initiator-utils/systemd/iscsi.service [deleted file]
iscsi-initiator-utils/systemd/iscsid.service [deleted file]
iscsi-initiator-utils/systemd/iscsid.socket [deleted file]

diff --git a/iscsi-initiator-utils/iscsi-initiator-utils.nm b/iscsi-initiator-utils/iscsi-initiator-utils.nm
deleted file mode 100644 (file)
index ca280d4..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-###############################################################################
-# IPFire.org    - An Open Source Firewall Solution                            #
-# Copyright (C) - IPFire Development Team <info@ipfire.org>                   #
-###############################################################################
-
-name       = iscsi-initiator-utils
-rel_ver    = 873
-version    = 6.2.0.%{rel_ver}
-release    = 3
-
-groups     = System/Daemons
-url        = http://www.open-iscsi.org/
-license    = GPLv2+
-summary    = iSCSI daemon and utility programs.
-
-description
-       The iscsi package provides the server daemon for the iSCSI protocol,
-       as well as the utility programs used to manage it. iSCSI is a protocol
-       for distributed disk access using SCSI commands sent over Internet
-       Protocol networks.
-end
-
-thisapp = open-iscsi-2.0-%{rel_ver}
-
-source_dl  = http://www.open-iscsi.org/bits/
-
-build
-       requires
-               doxygen
-               kmod-devel
-               openssl-devel
-               python-devel
-       end
-
-       build
-               make OPTFLAGS="%{CFLAGS} %{LDFLAGS} -DUSE_KMOD -lkmod"
-
-               pushd libiscsi
-               python setup.py build
-               popd
-       end
-
-       install
-               mkdir -pv %{BUILDROOT}%{sbindir}
-               mkdir -pv %{BUILDROOT}%{mandir}/man8
-               mkdir -pv %{BUILDROOT}%{sysconfdir}/iscsi
-               mkdir -pv %{BUILDROOT}%{localstatedir}/iscsi/{nodes,send_targets,static,isns,slp,ifaces}
-               mkdir -pv %{BUILDROOT}%{includedir}
-               mkdir -pv %{BUILDROOT}%{libdir}
-               mkdir -pv %{BUILDROOT}%{python_sitelib}
-
-               install -p -m 755 usr/iscsid usr/iscsiadm utils/iscsi-iname usr/iscsistart \
-                       %{BUILDROOT}%{sbindir}
-               install -p -m 644 doc/iscsiadm.8 %{BUILDROOT}%{mandir}/man8
-               install -p -m 644 doc/iscsid.8 %{BUILDROOT}%{mandir}/man8
-               install -p -m 644 etc/iscsid.conf %{BUILDROOT}%{sysconfdir}/iscsi
-               install -p -m 644 doc/iscsistart.8 %{BUILDROOT}%{mandir}/man8
-               install -p -m 644 doc/iscsi-iname.8 %{BUILDROOT}%{mandir}/man8
-
-               install -p -m 755 libiscsi/libiscsi.so.0 %{BUILDROOT}%{libdir}
-               ln -svf libiscsi.so.0 %{BUILDROOT}%{libdir}/libiscsi.so
-               install -p -m 644 libiscsi/libiscsi.h %{BUILDROOT}%{includedir}
-
-               install -p -m 755 libiscsi/build/lib.linux-*/libiscsimodule.so \
-                       %{BUILDROOT}%{python_sitelib}
-
-               install -p -m 755 %{DIR_SOURCE}/iscsi_mark_root_nodes %{BUILDROOT}%{prefix}/lib/
-       end
-end
-
-packages
-       package %{name}
-               prerequires += systemd-units
-
-               requires
-                       libiscsi = %{thisver}
-               end
-
-               configfiles
-                       %{sysconfdir}/iscsi/iscsid.conf
-               end
-
-               script postin
-                       if [ ! -f "%{sysconfdir}/iscsi/initiatorname.iscsi" ]; then
-                               echo "InitiatorName=$(iscsi-iname)" > %{sysconfdir}/iscsi/initiatorname.iscsi
-                       fi
-
-                       systemctl daemon-reload >/dev/null 2>&1 || :
-                       systemctl --no-reload enable iscsid.socket >/dev/null 2>&1 || :
-               end
-
-               script preun
-                       systemctl --no-reload disable iscsid.socket >/dev/null 2>&1 || :
-                       systemctl --no-reload disable iscsid.service >/dev/null 2>&1 || :
-                       systemctl --no-reload disable iscsi.service >/dev/null 2>&1 || :
-                       systemctl stop iscsi.service >/dev/null 2>&1 || :
-                       systemctl stop iscsid.socket >/dev/null 2>&1 || :
-                       systemctl stop iscsid.service >/dev/null 2>&1 || :
-               end
-
-               script postun
-                       systemctl daemon-reload >/dev/null 2>&1 || :
-               end
-
-               script postup
-                       systemctl daemon-reload >/dev/null 2>&1 || :
-                       systemctl try-restart iscsi.service >/dev/null 2>&1 || :
-                       systemctl try-restart iscsid.service >/dev/null 2>&1 || :
-               end
-       end
-
-       package libiscsi
-               template LIBS
-
-               files
-                       %{libdir}/libiscsi.so.*
-               end
-       end
-
-       package libiscsi-devel
-               template DEVEL
-
-               files
-                       %{libdir}/libiscsi.so
-                       /usr/include
-               end
-       end
-
-       package %{name}-debuginfo
-               template DEBUGINFO
-       end
-end
diff --git a/iscsi-initiator-utils/iscsi.tmpfiles b/iscsi-initiator-utils/iscsi.tmpfiles
deleted file mode 100644 (file)
index eab4fb2..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-d /run/lock/iscsi 0700 root root -
-f /run/lock/iscsi/lock 0600 root root -
diff --git a/iscsi-initiator-utils/iscsi_mark_root_nodes b/iscsi-initiator-utils/iscsi_mark_root_nodes
deleted file mode 100644 (file)
index c68475c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-
-ISCSIADM=/sbin/iscsiadm
-SESSION_FILE=/run/initramfs/iscsi.sessions
-
-if [ ! -f $SESSION_FILE ] ; then
-  exit 0
-fi
-
-while read t num i target; do
-  ip=${i%:*}
-  $ISCSIADM -m node -p $ip -T $target -o update -n node.startup -v onboot
-done < $SESSION_FILE
-
diff --git a/iscsi-initiator-utils/patches/0001-iscsid-fix-iscsid-segfault-during-qla4xxx-login.patch b/iscsi-initiator-utils/patches/0001-iscsid-fix-iscsid-segfault-during-qla4xxx-login.patch
deleted file mode 100644 (file)
index eabacbb..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-From 71cd021b74a7094b5186a42bfe59a35e2fa66018 Mon Sep 17 00:00:00 2001
-From: Mike Christie <michaelc@cs.wisc.edu>
-Date: Wed, 5 Sep 2012 16:18:16 -0500
-Subject: iscsid: fix iscsid segfault during qla4xxx login
-
-If the kernel sends multiple ISCSI_KEVENT_CONN_LOGIN_STATE
-events for the same login event iscsid will segault.
-
-When we get a conn error we will set the r_stage to reopen, then when
-session_conn_process_login handles the first login event we set the r_stage
-to R_STAGE_NO_CHANGE. But then it looks like if we get a second login event
-r_stage is no_change and session_conn_process_login will run again and
-call mgmt_ipc_write_rsp on a bad qtask.
----
- usr/initiator.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/usr/initiator.c b/usr/initiator.c
-index 79ca32c..d475358 100644
---- a/usr/initiator.c
-+++ b/usr/initiator.c
-@@ -993,7 +993,7 @@ static void session_scan_host(struct iscsi_session *session, int hostno,
-               exit(0);
-       } else if (pid > 0) {
-               reap_inc();
--              if (qtask) {
-+              if (qtask && qtask->mgmt_ipc_fd >= 0) {
-                       close(qtask->mgmt_ipc_fd);
-                       free(qtask);
-               }
-@@ -1618,6 +1618,9 @@ static void session_conn_process_login(void *data)
-       if (state == ISCSI_CONN_STATE_FREE)
-               goto failed_login;
-+      if (conn->state == ISCSI_CONN_STATE_LOGGED_IN)
-+              return;
-+
-       conn->state = ISCSI_CONN_STATE_LOGGED_IN;
-       /*
-        * ok we were in_login and now we got the notification that we are
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0002-ISCSISTART-Bring-up-the-corresponding-network-interf.patch b/iscsi-initiator-utils/patches/0002-ISCSISTART-Bring-up-the-corresponding-network-interf.patch
deleted file mode 100644 (file)
index 844babf..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-From f0a8c95426d21413d9980d31740e193208e3280e Mon Sep 17 00:00:00 2001
-From: Eddie Wai <eddie.wai@broadcom.com>
-Date: Wed, 5 Sep 2012 14:14:20 -0700
-Subject: ISCSISTART: Bring up the corresponding network interface for iboot
-
-This is needed for the iSCSI offload boot.
-
-Snip from M. Christie:
-Note that we must bring up the interface before iface_setup_from_boot_context,
-because we will want iscsi_sysfs_get_host_no_from_hwaddress to be able to match
-a MAC to a iscsi host.  For some bnx2i cards, the card has to be ifupd for the
-iscsi interface to have a MAC. If it is not ifupd we have seen MACs with all
-zeros or no iscsi_hosts on different cards.
-
-Signed-off-by: Eddie Wai <eddie.wai@broadcom.com>
----
- usr/iface.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/usr/iface.c b/usr/iface.c
-index 3a9582e..4028e34 100644
---- a/usr/iface.c
-+++ b/usr/iface.c
-@@ -917,6 +917,10 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
-                                                       transport_name))
-                       t = iscsi_sysfs_get_transport_by_name(transport_name);
-+              if (net_ifup_netdev(context->iface))
-+                      log_warning("Could not bring up netdev %s for boot",
-+                                  context->iface);
-+
-               hostno = iscsi_sysfs_get_host_no_from_hwaddress(context->mac,
-                                                               &rc);
-               if (rc) {
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0003-iscsi-tools-fix-compile-error-when-OFFLOAD_BOOT_SUPP.patch b/iscsi-initiator-utils/patches/0003-iscsi-tools-fix-compile-error-when-OFFLOAD_BOOT_SUPP.patch
deleted file mode 100644 (file)
index c80ff3a..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-From d81fd4903cebb1d00aa48b0718d20e34b00dfde1 Mon Sep 17 00:00:00 2001
-From: Mike Christie <michaelc@cs.wisc.edu>
-Date: Wed, 26 Sep 2012 21:19:39 -0500
-Subject: iscsi tools: fix compile error when OFFLOAD_BOOT_SUPPORT defined
-
-Fix compile error when OFFLOAD_BOOT_SUPPORT is defined and fix
-warning when it is defined.
----
- usr/iface.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/usr/iface.c b/usr/iface.c
-index 4028e34..4f81a76 100644
---- a/usr/iface.c
-+++ b/usr/iface.c
-@@ -894,7 +894,6 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
-                                  struct boot_context *context)
- {
-       struct iscsi_transport *t = NULL;
--      char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN];
-       uint32_t hostno;
-       if (strlen(context->initiatorname))
-@@ -910,6 +909,8 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
-       } else if (strlen(context->iface)) {
- /* this ifdef is only temp until distros and firmwares are updated */
- #ifdef OFFLOAD_BOOT_SUPPORTED
-+              char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN];
-+              int rc;
-               memset(transport_name, 0, ISCSI_TRANSPORT_NAME_MAXLEN);
-               /* make sure offload driver is loaded */
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0004-ISCSID-Passing-more-net-params-from-ibft-to-iface.patch b/iscsi-initiator-utils/patches/0004-ISCSID-Passing-more-net-params-from-ibft-to-iface.patch
deleted file mode 100644 (file)
index 5de8d3e..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-From 13d08e79090421fbf67fd727aada487ea23ecc2d Mon Sep 17 00:00:00 2001
-From: Eddie Wai <eddie.wai@broadcom.com>
-Date: Thu, 27 Sep 2012 13:57:12 -0700
-Subject: ISCSID: Passing more net params from ibft to iface
-
-Added the passing of the vlan_id, subnet_mask, and gateway attributes
-from the ibft context to the iface struct for the connection request.
-
-Signed-off-by: Eddie Wai <eddie.wai@broadcom.com>
----
- usr/iface.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/usr/iface.c b/usr/iface.c
-index 4f81a76..c86892e 100644
---- a/usr/iface.c
-+++ b/usr/iface.c
-@@ -962,6 +962,11 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
-               sizeof(iface->hwaddress));
-       strlcpy(iface->ipaddress, context->ipaddr,
-               sizeof(iface->ipaddress));
-+      iface->vlan_id = atoi(context->vlan);
-+      strlcpy(iface->subnet_mask, context->mask,
-+              sizeof(iface->subnet_mask));
-+      strlcpy(iface->gateway, context->gateway,
-+              sizeof(iface->gateway));
-       log_debug(1, "iface " iface_fmt "\n", iface_str(iface));
-       return 1;
- }
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0005-iscsi-tools-Convert-r-argument-to-an-integer-before-.patch b/iscsi-initiator-utils/patches/0005-iscsi-tools-Convert-r-argument-to-an-integer-before-.patch
deleted file mode 100644 (file)
index 4a95ac1..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-From 9dd181dcb1ca299cd82075b8e598fc57d87ee1c0 Mon Sep 17 00:00:00 2001
-From: Jim Ramsay <jim_ramsay@dell.com>
-Date: Wed, 3 Oct 2012 09:57:43 -0400
-Subject: iscsi tools: Convert '-r' argument to an integer before checking if
- it is a path
-
-If there is a file in the CWD named '1' and you were trying to run
-'iscsiadm -m session -r 1 ...', the command would fail with "1 is not a
-directory".
-
-Root cause: The code that parses the -r option's argument tries lstat(2)
-first, falling back to atoi(3) only if lstat fails.
-
-This change inverts the order of checks, first with strtol(3) to see if
-the argument given is a positive integer, then falling back to lstat(2)
-only if it is not.
-
-Signed-off-by: Jim Ramsay <jim_ramsay@dell.com>
----
- usr/iscsi_sysfs.c | 17 +++++++++--------
- 1 file changed, 9 insertions(+), 8 deletions(-)
-
-diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c
-index 123dde3..4015b35 100644
---- a/usr/iscsi_sysfs.c
-+++ b/usr/iscsi_sysfs.c
-@@ -740,7 +740,7 @@ int iscsi_sysfs_session_has_leadconn(uint32_t sid)
-  * /sys/devices/platform/hostH/sessionS/targetH:B:I
-  * /sys/devices/platform/hostH/sessionS
-  *
-- * return the sid S. If just the sid is passed in it will be covnerted
-+ * return the sid S. If just the sid is passed in it will be converted
-  * to a int.
-  */
- int iscsi_sysfs_get_sid_from_path(char *session)
-@@ -748,15 +748,16 @@ int iscsi_sysfs_get_sid_from_path(char *session)
-       struct sysfs_device *dev_parent, *dev;
-       struct stat statb;
-       char devpath[PATH_SIZE];
-+      char *end;
-+      int sid;
-+
-+      sid = strtol(session, &end, 10);
-+      if (sid > 0 && *session != '\0' && *end == '\0')
-+              return sid;
-       if (lstat(session, &statb)) {
--              log_debug(1, "Could not stat %s failed with %d",
--                        session, errno);
--              if (index(session, '/')) {
--                      log_error("%s is an invalid session path\n", session);
--                      exit(1);
--              }
--              return atoi(session);
-+              log_error("%s is an invalid session ID or path\n", session);
-+              exit(1);
-       }
-       if (!S_ISDIR(statb.st_mode) && !S_ISLNK(statb.st_mode)) {
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0006-Update-README-for-removal-of-DBM-requirement.patch b/iscsi-initiator-utils/patches/0006-Update-README-for-removal-of-DBM-requirement.patch
deleted file mode 100644 (file)
index 3fb2408..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-From 97db3db45c7e96888ea48a54ff19b7ff5d08cca6 Mon Sep 17 00:00:00 2001
-From: Andy Grover <agrover@redhat.com>
-Date: Wed, 24 Oct 2012 15:37:28 -0700
-Subject: Update README for removal of DBM requirement
-
-Removed in 093b1f4 (2006)
-
-Signed-off-by: Andy Grover <agrover@redhat.com>
----
- README | 23 ++++++++++++++---------
- 1 file changed, 14 insertions(+), 9 deletions(-)
-
-diff --git a/README b/README
-index 7364b2d..ec22098 100644
---- a/README
-+++ b/README
-@@ -159,15 +159,20 @@ Usage: iscsid [OPTION]
- 5. Open-iSCSI Configuration Utility
- ===================================
--Open-iSCSI persistent configuration is implemented as a DBM database
--available on all Linux installations.
--
--The database contains two tables:
--
--- Discovery table (/etc/iscsi/send_targets);
--- Node table (/etc/iscsi/nodes).
--
--The regular place for iSCSI database files: /etc/iscsi/nodes
-+Open-iSCSI persistent configuration is stored in a number of
-+directories under a configuration root directory, using a flat-file
-+format. This configuration root directory is /etc/iscsi by default,
-+but may also commonly be in /var/lib/iscsi.
-+
-+Configuration is contained in directories for:
-+
-+- nodes
-+- slp
-+- isns
-+- static
-+- fw
-+- send_targets
-+- ifaces
- The iscsiadm utility is a command-line tool to manage (update, delete,
- insert, query) the persistent database.
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0007-iscsid-iscsiadm-fix-abstract-socket-length-in-bind-c.patch b/iscsi-initiator-utils/patches/0007-iscsid-iscsiadm-fix-abstract-socket-length-in-bind-c.patch
deleted file mode 100644 (file)
index 53ade5f..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-From 2d086a831dc16d10729d6fce17bed3ade3efd16c Mon Sep 17 00:00:00 2001
-From: Tomasz Torcz <tomek@pipebreaker.pl>
-Date: Wed, 28 Nov 2012 13:37:06 +0100
-Subject: iscsid,iscsiadm: fix abstract socket length in bind() call
-
-For abstract sockets, the addrlen parameter should be the actual
-length of socket's name.  Otherwise socket gets padded with some
-number of NULs.
----
- usr/iscsid_req.c | 10 ++++++----
- usr/mgmt_ipc.c   |  9 +++++----
- 2 files changed, 11 insertions(+), 8 deletions(-)
-
-diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c
-index 0902011..1c4678d 100644
---- a/usr/iscsid_req.c
-+++ b/usr/iscsid_req.c
-@@ -56,7 +56,7 @@ static void iscsid_startup(void)
- static int iscsid_connect(int *fd, int start_iscsid)
- {
--      int nsec;
-+      int nsec, addr_len;
-       struct sockaddr_un addr;
-       *fd = socket(AF_LOCAL, SOCK_STREAM, 0);
-@@ -65,15 +65,17 @@ static int iscsid_connect(int *fd, int start_iscsid)
-               return ISCSI_ERR_ISCSID_NOTCONN;
-       }
-+      addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1;
-+
-       memset(&addr, 0, sizeof(addr));
-       addr.sun_family = AF_LOCAL;
--      memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE,
--              strlen(ISCSIADM_NAMESPACE));
-+      memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len);
-+
-       /*
-        * Trying to connect with exponential backoff
-        */
-       for (nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) {
--              if (connect(*fd, (struct sockaddr *) &addr, sizeof(addr)) == 0)
-+              if (connect(*fd, (struct sockaddr *) &addr, addr_len) == 0)
-                       /* Connection established */
-                       return ISCSI_SUCCESS;
-diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c
-index 5c39c2e..a1dafc9 100644
---- a/usr/mgmt_ipc.c
-+++ b/usr/mgmt_ipc.c
-@@ -43,7 +43,7 @@
- int
- mgmt_ipc_listen(void)
- {
--      int fd, err;
-+      int fd, err, addr_len;
-       struct sockaddr_un addr;
-       fd = socket(AF_LOCAL, SOCK_STREAM, 0);
-@@ -52,12 +52,13 @@ mgmt_ipc_listen(void)
-               return fd;
-       }
-+      addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1;
-+
-       memset(&addr, 0, sizeof(addr));
-       addr.sun_family = AF_LOCAL;
--      memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE,
--              strlen(ISCSIADM_NAMESPACE));
-+      memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len);
--      if ((err = bind(fd, (struct sockaddr *) &addr, sizeof(addr))) < 0) {
-+      if ((err = bind(fd, (struct sockaddr *) &addr, addr_len)) < 0 ) {
-               log_error("Can not bind IPC socket");
-               close(fd);
-               return err;
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0008-iscsid-implement-systemd-compatible-socket-activatio.patch b/iscsi-initiator-utils/patches/0008-iscsid-implement-systemd-compatible-socket-activatio.patch
deleted file mode 100644 (file)
index 2e4715c..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-From 5d0e19fcc1cea77a72647cf96c5d3d773e8ee277 Mon Sep 17 00:00:00 2001
-From: Tomasz Torcz <tomek@pipebreaker.pl>
-Date: Wed, 28 Nov 2012 13:37:07 +0100
-Subject: iscsid: implement systemd-compatible socket activation
-
----
- usr/mgmt_ipc.c | 29 +++++++++++++++++++++++++++++
- usr/mgmt_ipc.h |  1 +
- 2 files changed, 30 insertions(+)
-
-diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c
-index a1dafc9..87bd346 100644
---- a/usr/mgmt_ipc.c
-+++ b/usr/mgmt_ipc.c
-@@ -39,6 +39,7 @@
- #define PEERUSER_MAX  64
- #define EXTMSG_MAX    (64 * 1024)
-+#define SD_SOCKET_FDS_START 3
- int
- mgmt_ipc_listen(void)
-@@ -46,6 +47,12 @@ mgmt_ipc_listen(void)
-       int fd, err, addr_len;
-       struct sockaddr_un addr;
-+      /* first check if we have fd handled by systemd */
-+      fd = mgmt_ipc_systemd();
-+      if (fd >= 0)
-+              return fd;
-+
-+      /* manually establish a socket */
-       fd = socket(AF_LOCAL, SOCK_STREAM, 0);
-       if (fd < 0) {
-               log_error("Can not create IPC socket");
-@@ -73,6 +80,28 @@ mgmt_ipc_listen(void)
-       return fd;
- }
-+int mgmt_ipc_systemd(void)
-+{
-+      const char *env;
-+
-+      env = getenv("LISTEN_PID");
-+
-+      if (!env || (strtoul(env, NULL, 10) != getpid()))
-+              return -EINVAL;
-+
-+      env = getenv("LISTEN_FDS");
-+
-+      if (!env)
-+              return -EINVAL;
-+
-+      if (strtoul(env, NULL, 10) != 1) {
-+              log_error("Did not receive exactly one IPC socket from systemd");
-+              return -EINVAL;
-+      }
-+
-+      return SD_SOCKET_FDS_START;
-+}
-+
- void
- mgmt_ipc_close(int fd)
- {
-diff --git a/usr/mgmt_ipc.h b/usr/mgmt_ipc.h
-index 7d8ce72..55972ed 100644
---- a/usr/mgmt_ipc.h
-+++ b/usr/mgmt_ipc.h
-@@ -112,6 +112,7 @@ typedef int mgmt_ipc_fn_t(struct queue_task *);
- struct queue_task;
- void mgmt_ipc_write_rsp(struct queue_task *qtask, int err);
- int mgmt_ipc_listen(void);
-+int mgmt_ipc_systemd(void);
- void mgmt_ipc_close(int fd);
- void mgmt_ipc_handle(int accept_fd);
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0009-iscsid-add-example-unit-files-for-systemd.patch b/iscsi-initiator-utils/patches/0009-iscsid-add-example-unit-files-for-systemd.patch
deleted file mode 100644 (file)
index 28b9b78..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-From c34e0bdcbafdb6f9304e1474d51fe1c789c5dea2 Mon Sep 17 00:00:00 2001
-From: Tomasz Torcz <tomek@pipebreaker.pl>
-Date: Wed, 28 Nov 2012 13:37:08 +0100
-Subject: iscsid: add example unit files for systemd
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Those two units, based on the work by Jóhann B. Guðmundsson, exploit
-on-demand socket activation in iscsid.
----
- etc/systemd/iscsid.service | 13 +++++++++++++
- etc/systemd/iscsid.socket  |  9 +++++++++
- 2 files changed, 22 insertions(+)
- create mode 100644 etc/systemd/iscsid.service
- create mode 100644 etc/systemd/iscsid.socket
-
-diff --git a/etc/systemd/iscsid.service b/etc/systemd/iscsid.service
-new file mode 100644
-index 0000000..028e0b3
---- /dev/null
-+++ b/etc/systemd/iscsid.service
-@@ -0,0 +1,13 @@
-+[Unit]
-+Description=Open-iSCSI
-+Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8)
-+After=network.target NetworkManager-wait-online.service iscsiuio.service tgtd.service targetcli.service
-+
-+[Service]
-+Type=forking
-+PIDFile=/var/run/iscsid.pid
-+ExecStart=/usr/sbin/iscsid
-+ExecStop=/sbin/iscsiadm -k 0 2
-+
-+[Install]
-+WantedBy=multi-user.target
-diff --git a/etc/systemd/iscsid.socket b/etc/systemd/iscsid.socket
-new file mode 100644
-index 0000000..832451d
---- /dev/null
-+++ b/etc/systemd/iscsid.socket
-@@ -0,0 +1,9 @@
-+[Unit]
-+Description=Open-iSCSI iscsid Socket
-+Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8)
-+
-+[Socket]
-+ListenStream=@ISCSIADM_ABSTRACT_NAMESPACE
-+
-+[Install]
-+WantedBy=sockets.target
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0010-iscsi-tools-fix-get_random_bytes-error-handling.patch b/iscsi-initiator-utils/patches/0010-iscsi-tools-fix-get_random_bytes-error-handling.patch
deleted file mode 100644 (file)
index a177796..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-From a7afdf46c3193eb102cc6ec2a3b61e8d36794437 Mon Sep 17 00:00:00 2001
-From: Mike Christie <michaelc@cs.wisc.edu>
-Date: Fri, 14 Dec 2012 12:40:27 -0600
-Subject: iscsi tools: fix get_random_bytes error handling
-
-Bug report from Rahul:
-
-There seems to be a bug in function get_random_bytes(). I reported
-this earlier as well but somehow it didn't appear here.
-
-get_random_bytes(unsigned char *data, unsigned int length)
-{
-       long r;
-        unsigned n;
-       int fd;
-
-       fd = open("/dev/urandom", O_RDONLY);
-               while (length > 0) {
-
-       if (!fd || read(fd, &r, sizeof(long)) != -1)      <<<< the condition is
-incorrect
----
- usr/auth.c | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/usr/auth.c b/usr/auth.c
-index c924545..4ff0425 100644
---- a/usr/auth.c
-+++ b/usr/auth.c
-@@ -189,24 +189,24 @@ get_random_bytes(unsigned char *data, unsigned int length)
-       long r;
-         unsigned n;
--      int fd;
-+      int fd, r_size = sizeof(r);
-       fd = open("/dev/urandom", O_RDONLY);
-         while (length > 0) {
--              if (!fd || read(fd, &r, sizeof(long)) != -1)
-+              if (fd == -1 || read(fd, &r, r_size) != r_size)
-                       r = rand();
-                 r = r ^ (r >> 8);
-                 r = r ^ (r >> 4);
-                 n = r & 0x7;
--              if (!fd || read(fd, &r, sizeof(long)) != -1)
-+              if (fd == -1 || read(fd, &r, r_size) != r_size)
-                       r = rand();
-                 r = r ^ (r >> 8);
-                 r = r ^ (r >> 5);
-                 n = (n << 3) | (r & 0x7);
--              if (!fd || read(fd, &r, sizeof(long)) != -1)
-+              if (fd == -1 || read(fd, &r, r_size) != r_size)
-                       r = rand();
-                 r = r ^ (r >> 8);
-                 r = r ^ (r >> 5);
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0031-iscsid-add-initrd-option-to-set-run-from-initrd-hint.patch b/iscsi-initiator-utils/patches/0031-iscsid-add-initrd-option-to-set-run-from-initrd-hint.patch
deleted file mode 100644 (file)
index 358b50c..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-From b1799fe84ed94a19bba6bcd7284ce8b038be4ffe Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Mon, 10 Dec 2012 13:20:47 -0800
-Subject: iscsid: add --initrd option to set run from initrd hint for systemd
-
-See http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons
-
-Signed-off-by: Chris Leech <cleech@redhat.com>
----
- usr/iscsid.c | 8 ++++++++
- 1 file changed, 8 insertions(+)
-
-diff --git a/usr/iscsid.c b/usr/iscsid.c
-index b4bb65b..7d71085 100644
---- a/usr/iscsid.c
-+++ b/usr/iscsid.c
-@@ -61,6 +61,7 @@ static pid_t log_pid;
- static gid_t gid;
- static int daemonize = 1;
- static int mgmt_ipc_fd;
-+static int initrd = 0;
- static struct option const long_options[] = {
-       {"config", required_argument, NULL, 'c'},
-@@ -73,6 +74,7 @@ static struct option const long_options[] = {
-       {"pid", required_argument, NULL, 'p'},
-       {"help", no_argument, NULL, 'h'},
-       {"version", no_argument, NULL, 'v'},
-+      {"initrd", no_argument, &initrd, 1},
-       {NULL, 0, NULL, 0},
- };
-@@ -95,6 +97,7 @@ Open-iSCSI initiator daemon.\n\
-   -p, --pid=pidfile       use pid file (default " PID_FILE ").\n\
-   -h, --help              display this help and exit\n\
-   -v, --version           display version and exit\n\
-+  --initrd                run from initrd\n\
- ");
-       }
-       exit(status);
-@@ -383,12 +386,17 @@ int main(int argc, char *argv[])
-               case 'h':
-                       usage(0);
-                       break;
-+              case 0:
-+                      break;
-               default:
-                       usage(1);
-                       break;
-               }
-       }
-+      if (initrd)
-+              argv[0][0] = '@';
-+
-       /* initialize logger */
-       log_pid = log_init(program_name, DEFAULT_AREA_SIZE,
-                     daemonize ? log_do_log_daemon : log_do_log_std, NULL);
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0032-iscsiadm-iscsid-newroot-command-to-survive-switch_ro.patch b/iscsi-initiator-utils/patches/0032-iscsiadm-iscsid-newroot-command-to-survive-switch_ro.patch
deleted file mode 100644 (file)
index be06f26..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-From ac3447ab680ef5319717fc6b85a4c5b22e652e5e Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Fri, 7 Dec 2012 17:01:42 -0800
-Subject: iscsiadm, iscsid: newroot command to survive switch_root
-
-When started from initramfs, iscsid needs to be able to chroot itself
-to the runtime filesystem before the switch_root occurs.  In the
-initramfs "iscsiadm --newroot {root fs mount before switch}" should be
-called before the switch_root.
-
-Signed-off-by: Chris Leech <cleech@redhat.com>
----
- usr/iscsiadm.c | 30 ++++++++++++++++++++++++++++++
- usr/mgmt_ipc.c | 11 +++++++++++
- usr/mgmt_ipc.h |  6 +++++-
- 3 files changed, 46 insertions(+), 1 deletion(-)
-
-diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
-index 8f9de05..323d0a8 100644
---- a/usr/iscsiadm.c
-+++ b/usr/iscsiadm.c
-@@ -111,6 +111,7 @@ static struct option const long_options[] =
-       {"packetsize", required_argument, NULL, 'b'},
-       {"count", required_argument, NULL, 'c'},
-       {"interval", required_argument, NULL, 'i'},
-+      {"newroot", required_argument, NULL, 0},
-       {NULL, 0, NULL, 0},
- };
- static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:u";
-@@ -131,6 +132,7 @@ iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P  printlevel] [ -r sessionid
- iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o  operation  ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\
- iscsiadm -m fw [ -l ]\n\
- iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ]\n\
-+iscsiadm --newroot switch_root_path\n\
- iscsiadm -k priority\n");
-       }
-       exit(status);
-@@ -251,6 +253,22 @@ static void kill_iscsid(int priority)
-       }
- }
-+static void do_newroot(char *newroot)
-+{
-+      iscsiadm_req_t req;
-+      iscsiadm_rsp_t rsp;
-+      int rc;
-+
-+      memset(&req, 0, sizeof(req));
-+      req.command = MGMT_IPC_NEWROOT;
-+      strncpy(req.u.newroot.path, newroot, PATH_MAX);
-+      rc = iscsid_exec_req(&req, &rsp, 0);
-+      if (rc) {
-+              iscsi_err_print_msg(rc);
-+              log_error("Could not send NEWROOT command");
-+      }
-+}
-+
- /*
-  * TODO: we can display how the ifaces are related to node records.
-  * And we can add a scsi_host mode which would display how
-@@ -2397,6 +2415,7 @@ main(int argc, char **argv)
- {
-       char *ip = NULL, *name = NULL, *value = NULL;
-       char *targetname = NULL, *group_session_mgmt_mode = NULL;
-+      char *newroot = NULL;
-       int ch, longindex, mode=-1, port=-1, do_login=0, do_rescan=0;
-       int rc=0, sid=-1, op=OP_NOOP, type=-1, do_logout=0, do_stats=0;
-       int do_login_all=0, do_logout_all=0, info_level=-1, num_ifaces = 0;
-@@ -2433,6 +2452,12 @@ main(int argc, char **argv)
-       while ((ch = getopt_long(argc, argv, short_options,
-                                long_options, &longindex)) >= 0) {
-               switch (ch) {
-+              case 0:
-+                      if (long_options[longindex].flag != 0)
-+                              break;
-+                      if (!strcmp(long_options[longindex].name, "newroot"))
-+                              newroot = optarg;
-+                      break;
-               case 'k':
-                       killiscsid = atoi(optarg);
-                       if (killiscsid < 0) {
-@@ -2579,6 +2604,11 @@ main(int argc, char **argv)
-               goto free_ifaces;
-       }
-+      if (newroot) {
-+              do_newroot(newroot);
-+              goto free_ifaces;
-+      }
-+
-       if (mode < 0)
-               usage(ISCSI_ERR_INVAL);
-diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c
-index 87bd346..5cb7143 100644
---- a/usr/mgmt_ipc.c
-+++ b/usr/mgmt_ipc.c
-@@ -226,6 +226,16 @@ mgmt_ipc_immediate_stop(queue_task_t *qtask)
- }
- static int
-+mgmt_ipc_newroot(queue_task_t *qtask)
-+{
-+      char *newroot = qtask->req.u.newroot.path;
-+      if (chdir(newroot) || chroot(".") || chdir("/"))
-+              return ISCSI_ERR;
-+      mgmt_ipc_write_rsp(qtask, ISCSI_SUCCESS);
-+      return ISCSI_SUCCESS;
-+}
-+
-+static int
- mgmt_ipc_conn_remove(queue_task_t *qtask)
- {
-       return ISCSI_ERR;
-@@ -534,6 +544,7 @@ static mgmt_ipc_fn_t *     mgmt_ipc_functions[__MGMT_IPC_MAX_COMMAND] = {
- [MGMT_IPC_NOTIFY_DEL_NODE]    = mgmt_ipc_notify_del_node,
- [MGMT_IPC_NOTIFY_ADD_PORTAL]  = mgmt_ipc_notify_add_portal,
- [MGMT_IPC_NOTIFY_DEL_PORTAL]  = mgmt_ipc_notify_del_portal,
-+[MGMT_IPC_NEWROOT]            = mgmt_ipc_newroot,
- };
- void mgmt_ipc_handle(int accept_fd)
-diff --git a/usr/mgmt_ipc.h b/usr/mgmt_ipc.h
-index 55972ed..102ffff 100644
---- a/usr/mgmt_ipc.h
-+++ b/usr/mgmt_ipc.h
-@@ -22,6 +22,7 @@
- #include "types.h"
- #include "iscsi_if.h"
- #include "config.h"
-+#include "limits.h"
- #define ISCSIADM_NAMESPACE    "ISCSIADM_ABSTRACT_NAMESPACE"
- #define PEERUSER_MAX          64
-@@ -46,6 +47,7 @@ typedef enum iscsiadm_cmd {
-       MGMT_IPC_NOTIFY_DEL_NODE        = 17,
-       MGMT_IPC_NOTIFY_ADD_PORTAL      = 18,
-       MGMT_IPC_NOTIFY_DEL_PORTAL      = 19,
-+      MGMT_IPC_NEWROOT                = 20,
-       __MGMT_IPC_MAX_COMMAND
- } iscsiadm_cmd_e;
-@@ -75,8 +77,10 @@ typedef struct iscsiadm_req {
-                       int param;
-                       /* TODO: make this variable len to support */
-                       char value[IFNAMSIZ + 1];
--
-               } set_host_param;
-+              struct ipc_msg_newroot {
-+                      char path[PATH_MAX + 1];
-+              } newroot;
-       } u;
- } iscsiadm_req_t;
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0033-iscsiadm-param-parsing-for-advanced-node-creation.patch b/iscsi-initiator-utils/patches/0033-iscsiadm-param-parsing-for-advanced-node-creation.patch
deleted file mode 100644 (file)
index 6ab8f35..0000000
+++ /dev/null
@@ -1,337 +0,0 @@
-From a41a27cd9b910191a616706c4f473259909bc45d Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Tue, 18 Dec 2012 11:27:00 -0800
-Subject: iscsiadm: --param parsing for advanced node creation
-
-Share parse_param and apply_param code from iscsistart, allow using multiple
---param options to set arbitrary fields in node mode.
-
-Signed-off-by: Chris Leech <cleech@redhat.com>
----
- usr/Makefile      |  2 +-
- usr/iscsi_param.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
- usr/iscsi_param.h |  7 ++++
- usr/iscsiadm.c    | 16 ++++++++--
- usr/iscsistart.c  | 91 ++--------------------------------------------------
- 5 files changed, 120 insertions(+), 91 deletions(-)
- create mode 100644 usr/iscsi_param.c
- create mode 100644 usr/iscsi_param.h
-
-diff --git a/usr/Makefile b/usr/Makefile
-index 673b7f1..1506111 100644
---- a/usr/Makefile
-+++ b/usr/Makefile
-@@ -40,7 +40,7 @@ SYSDEPS_SRCS = $(wildcard ../utils/sysdeps/*.o)
- ISCSI_LIB_SRCS = iscsi_util.o io.o auth.o iscsi_timer.o login.o log.o md5.o \
-       sha1.o iface.o idbm.o sysfs.o host.o session_info.o iscsi_sysfs.o \
-       iscsi_net_util.o iscsid_req.o transport.o iser.o cxgbi.o be2iscsi.o \
--      initiator_common.o iscsi_err.o $(IPC_OBJ)  $(SYSDEPS_SRCS)
-+      initiator_common.o iscsi_err.o iscsi_param.o $(IPC_OBJ)  $(SYSDEPS_SRCS)
- # core initiator files
- INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o kern_err_table.o
-diff --git a/usr/iscsi_param.c b/usr/iscsi_param.c
-new file mode 100644
-index 0000000..c075e8f
---- /dev/null
-+++ b/usr/iscsi_param.c
-@@ -0,0 +1,95 @@
-+#include <string.h>
-+#include "log.h"
-+#include "config.h"
-+#include "idbm.h"
-+#include "list.h"
-+#include "iface.h"
-+#include "idbm_fields.h"
-+#include "iscsi_err.h"
-+
-+int apply_params(struct list_head *user_params, struct node_rec *rec)
-+{
-+      struct user_param *param;
-+      int rc;
-+
-+      /* Must init this so we can check if user overrode them */
-+      rec->session.initial_login_retry_max = -1;
-+      rec->conn[0].timeo.noop_out_interval = -1;
-+      rec->conn[0].timeo.noop_out_timeout = -1;
-+
-+      list_for_each_entry(param, user_params, list) {
-+              /*
-+               * user may not have passed in all params that were set by
-+               * ibft/iscsi_boot, so clear out values that might conflict
-+               * with user overrides
-+               */
-+              if (!strcmp(param->name, IFACE_NETNAME)) {
-+                      /* overriding netname so MAC will be for old netdev */
-+                      memset(rec->iface.hwaddress, 0,
-+                              sizeof(rec->iface.hwaddress));
-+              } else if (!strcmp(param->name, IFACE_HWADDR)) {
-+                      /* overriding MAC so netdev will be for old MAC */
-+                      memset(rec->iface.netdev, 0, sizeof(rec->iface.netdev));
-+              } else if (!strcmp(param->name, IFACE_TRANSPORTNAME)) {
-+                      /*
-+                       * switching drivers so all old binding info is no
-+                       * longer valid. Old values were either for offload
-+                       * and we are switching to software or the reverse,
-+                       * or switching types of cards (bnx2i to cxgb3i).
-+                       */
-+                      memset(&rec->iface, 0, sizeof(rec->iface));
-+                      iface_setup_defaults(&rec->iface);
-+              }
-+      }
-+
-+      rc = idbm_node_set_rec_from_param(user_params, rec, 0);
-+      if (rc)
-+              return rc;
-+
-+      /*
-+       * For root boot we could not change this in older versions so
-+       * if user did not override then use the defaults.
-+       *
-+       * Increase to account for boot using static setup.
-+       */
-+      if (rec->session.initial_login_retry_max == -1)
-+              rec->session.initial_login_retry_max = 30;
-+      /* we used to not be able to answer so turn off */
-+      if (rec->conn[0].timeo.noop_out_interval == -1)
-+              rec->conn[0].timeo.noop_out_interval = 0;
-+      if (rec->conn[0].timeo.noop_out_timeout == -1)
-+              rec->conn[0].timeo.noop_out_timeout = 0;
-+
-+      return 0;
-+}
-+
-+int parse_param(struct list_head *user_params, char *param_str)
-+{
-+      struct user_param *param;
-+      char *name, *value;
-+
-+      name = param_str;
-+
-+      value = strchr(param_str, '=');
-+      if (!value) {
-+              log_error("Invalid --param %s. Missing value.", param_str);
-+              return ISCSI_ERR_INVAL;
-+      }
-+      *value = '\0';
-+
-+      value++;
-+      if (!strlen(value)) {
-+              log_error("Invalid --param %s. Missing value.", param_str);
-+              return ISCSI_ERR_INVAL;
-+      }
-+
-+      param = idbm_alloc_user_param(name, value);
-+      if (!param) {
-+              log_error("Could not allocate memory for param.");
-+              return ISCSI_ERR_NOMEM;
-+      }
-+
-+      list_add(&param->list, user_params);
-+      return 0;
-+}
-+
-diff --git a/usr/iscsi_param.h b/usr/iscsi_param.h
-new file mode 100644
-index 0000000..8b7956c
---- /dev/null
-+++ b/usr/iscsi_param.h
-@@ -0,0 +1,7 @@
-+#ifndef ISCSI_PARAM_H
-+#define ISCSI_PARAM_H
-+
-+extern int parse_param(struct list_head *user_params, char *param_str);
-+extern int apply_params(struct list_head *user_params, struct node_rec *rec);
-+
-+#endif
-diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
-index 323d0a8..ef866ae 100644
---- a/usr/iscsiadm.c
-+++ b/usr/iscsiadm.c
-@@ -53,6 +53,7 @@
- #include "iscsi_err.h"
- #include "iscsi_ipc.h"
- #include "iscsi_timer.h"
-+#include "iscsi_param.h"
- static char program_name[] = "iscsiadm";
- static char config_file[TARGET_NAME_MAXLEN];
-@@ -112,6 +113,7 @@ static struct option const long_options[] =
-       {"count", required_argument, NULL, 'c'},
-       {"interval", required_argument, NULL, 'i'},
-       {"newroot", required_argument, NULL, 0},
-+      {"param", required_argument, NULL, 0},
-       {NULL, 0, NULL, 0},
- };
- static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:u";
-@@ -127,7 +129,7 @@ iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p
- [ -o operation ] [ -n name ] [ -v value ] [ -lD ] ] \n\
- iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ] \n\
- iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] \
--[ [ -o  operation  ] [ -n name ] [ -v value ] ]\n\
-+[ [ -o  operation  ] [ -n name ] [ -v value ] ] [ --param=NAME=VALUE ]\n\
- iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P  printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\
- iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o  operation  ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\
- iscsiadm -m fw [ -l ]\n\
-@@ -2430,9 +2432,11 @@ main(int argc, char **argv)
-       uint32_t host_no = -1;
-       struct user_param *param;
-       struct list_head params;
-+      struct list_head user_params;
-       INIT_LIST_HEAD(&params);
-       INIT_LIST_HEAD(&ifaces);
-+      INIT_LIST_HEAD(&user_params);
-       /* do not allow ctrl-c for now... */
-       memset(&sa_old, 0, sizeof(struct sigaction));
-       memset(&sa_new, 0, sizeof(struct sigaction));
-@@ -2455,8 +2459,14 @@ main(int argc, char **argv)
-               case 0:
-                       if (long_options[longindex].flag != 0)
-                               break;
--                      if (!strcmp(long_options[longindex].name, "newroot"))
-+                      if (!strcmp(long_options[longindex].name, "newroot")) {
-                               newroot = optarg;
-+                              break;
-+                      }
-+                      if (!strcmp(long_options[longindex].name, "param")) {
-+                              parse_param(&user_params, optarg);
-+                              break;
-+                      }
-                       break;
-               case 'k':
-                       killiscsid = atoi(optarg);
-@@ -2748,6 +2758,8 @@ main(int argc, char **argv)
-                       goto out;
-               }
-+              apply_params(&user_params, rec);
-+
-               rc = exec_node_op(op, do_login, do_logout, do_show,
-                                 do_rescan, do_stats, info_level, rec,
-                                 &params);
-diff --git a/usr/iscsistart.c b/usr/iscsistart.c
-index 6924d49..85be35b 100644
---- a/usr/iscsistart.c
-+++ b/usr/iscsistart.c
-@@ -50,6 +50,7 @@
- #include "iscsid_req.h"
- #include "iscsi_err.h"
- #include "iface.h"
-+#include "iscsi_param.h"
- /* global config info */
- /* initiator needs initiator name/alias */
-@@ -131,99 +132,13 @@ static int stop_event_loop(void)
-       return rc;
- }
--static int apply_params(struct node_rec *rec)
--{
--      struct user_param *param;
--      int rc;
--
--      /* Must init this so we can check if user overrode them */
--      rec->session.initial_login_retry_max = -1;
--      rec->conn[0].timeo.noop_out_interval = -1;
--      rec->conn[0].timeo.noop_out_timeout = -1;
--
--      list_for_each_entry(param, &user_params, list) {
--              /*
--               * user may not have passed in all params that were set by
--               * ibft/iscsi_boot, so clear out values that might conflict
--               * with user overrides
--               */
--              if (!strcmp(param->name, IFACE_NETNAME)) {
--                      /* overriding netname so MAC will be for old netdev */
--                      memset(rec->iface.hwaddress, 0,
--                              sizeof(rec->iface.hwaddress));
--              } else if (!strcmp(param->name, IFACE_HWADDR)) {
--                      /* overriding MAC so netdev will be for old MAC */
--                      memset(rec->iface.netdev, 0, sizeof(rec->iface.netdev));
--              } else if (!strcmp(param->name, IFACE_TRANSPORTNAME)) {
--                      /*
--                       * switching drivers so all old binding info is no
--                       * longer valid. Old values were either for offload
--                       * and we are switching to software or the reverse,
--                       * or switching types of cards (bnx2i to cxgb3i).
--                       */
--                      memset(&rec->iface, 0, sizeof(rec->iface));
--                      iface_setup_defaults(&rec->iface);
--              }
--      }
--
--      rc = idbm_node_set_rec_from_param(&user_params, rec, 0);
--      if (rc)
--              return rc;
--
--      /*
--       * For root boot we could not change this in older versions so
--       * if user did not override then use the defaults.
--       *
--       * Increase to account for boot using static setup.
--       */
--      if (rec->session.initial_login_retry_max == -1)
--              rec->session.initial_login_retry_max = 30;
--      /* we used to not be able to answer so turn off */
--      if (rec->conn[0].timeo.noop_out_interval == -1)
--              rec->conn[0].timeo.noop_out_interval = 0;
--      if (rec->conn[0].timeo.noop_out_timeout == -1)
--              rec->conn[0].timeo.noop_out_timeout = 0;
--
--      return 0;
--}
--
--static int parse_param(char *param_str)
--{
--      struct user_param *param;
--      char *name, *value;
--
--      name = param_str;
--
--      value = strchr(param_str, '=');
--      if (!value) {
--              log_error("Invalid --param %s. Missing value.", param_str);
--              return ISCSI_ERR_INVAL;
--      }
--      *value = '\0';
--
--      value++;
--      if (!strlen(value)) {
--              log_error("Invalid --param %s. Missing value.", param_str);
--              return ISCSI_ERR_INVAL;
--      }
--
--      param = idbm_alloc_user_param(name, value);
--      if (!param) {
--              log_error("Could not allocate memory for param.");
--              return ISCSI_ERR_NOMEM;
--      }
--
--      list_add(&param->list, &user_params);
--      return 0;
--}
--
- static int login_session(struct node_rec *rec)
- {
-       iscsiadm_req_t req;
-       iscsiadm_rsp_t rsp;
-       int rc, retries = 0;
--      rc = apply_params(rec);
-+      rc = apply_params(&user_params, rec);
-       if (rc)
-               return rc;
-@@ -426,7 +341,7 @@ int main(int argc, char *argv[])
-                       fw_free_targets(&targets);
-                       exit(0);
-               case 'P':
--                      err = parse_param(optarg);
-+                      err = parse_param(&user_params, optarg);
-                       if (err)
-                               exit(err);
-                       break;
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0034-update-systemd-service-files-add-iscsi.service-for-s.patch b/iscsi-initiator-utils/patches/0034-update-systemd-service-files-add-iscsi.service-for-s.patch
deleted file mode 100644 (file)
index 966bb9f..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-From 1c3b1d23e0b3f17399ffd4463cafad813b0444d5 Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Wed, 19 Dec 2012 15:07:36 -0800
-Subject: update systemd service files, add iscsi.service for starting
- sessions on boot
-
-Signed-off-by: Chris Leech <cleech@redhat.com>
----
- etc/systemd/iscsi.service         | 19 +++++++++++++++++++
- etc/systemd/iscsi_mark_root_nodes | 14 ++++++++++++++
- etc/systemd/iscsid.service        |  7 +++++--
- etc/systemd/iscsid.socket         |  2 +-
- 4 files changed, 39 insertions(+), 3 deletions(-)
- create mode 100644 etc/systemd/iscsi.service
- create mode 100755 etc/systemd/iscsi_mark_root_nodes
-
-diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service
-new file mode 100644
-index 0000000..bbd52fd
---- /dev/null
-+++ b/etc/systemd/iscsi.service
-@@ -0,0 +1,19 @@
-+[Unit]
-+Description=Login and scanning of iSCSI devices
-+Documentation=man:iscsid(8) man:iscsiadm(8)
-+DefaultDependencies=no
-+Conflicts=shutdown.target
-+After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service
-+Before=remote-fs-pre.target
-+ConditionPathExists=/etc/iscsi/initiatorname.iscsi
-+
-+[Service]
-+Type=oneshot
-+RemainAfterExit=true
-+ExecStart=/usr/libexec/iscsi_mark_root_nodes
-+ExecStart=/sbin/iscsiadm -m node --loginall=automatic
-+ExecStop=/bin/sync
-+ExecStop=/sbin/iscsiadm -m node --logoutall=automatic
-+
-+[Install]
-+WantedBy=sysinit.target
-diff --git a/etc/systemd/iscsi_mark_root_nodes b/etc/systemd/iscsi_mark_root_nodes
-new file mode 100755
-index 0000000..c68475c
---- /dev/null
-+++ b/etc/systemd/iscsi_mark_root_nodes
-@@ -0,0 +1,14 @@
-+#!/bin/bash
-+
-+ISCSIADM=/sbin/iscsiadm
-+SESSION_FILE=/run/initramfs/iscsi.sessions
-+
-+if [ ! -f $SESSION_FILE ] ; then
-+  exit 0
-+fi
-+
-+while read t num i target; do
-+  ip=${i%:*}
-+  $ISCSIADM -m node -p $ip -T $target -o update -n node.startup -v onboot
-+done < $SESSION_FILE
-+
-diff --git a/etc/systemd/iscsid.service b/etc/systemd/iscsid.service
-index 028e0b3..653dd08 100644
---- a/etc/systemd/iscsid.service
-+++ b/etc/systemd/iscsid.service
-@@ -1,7 +1,10 @@
- [Unit]
- Description=Open-iSCSI
--Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8)
--After=network.target NetworkManager-wait-online.service iscsiuio.service tgtd.service targetcli.service
-+Documentation=man:iscsid(8) man:iscsiadm(8)
-+DefaultDependencies=no
-+Conflicts=shutdown.target
-+After=network.target iscsiuio.service
-+Before=remote-fs-pre.target
- [Service]
- Type=forking
-diff --git a/etc/systemd/iscsid.socket b/etc/systemd/iscsid.socket
-index 832451d..58a8d12 100644
---- a/etc/systemd/iscsid.socket
-+++ b/etc/systemd/iscsid.socket
-@@ -1,6 +1,6 @@
- [Unit]
- Description=Open-iSCSI iscsid Socket
--Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8)
-+Documentation=man:iscsid(8) man:iscsiadm(8)
- [Socket]
- ListenStream=@ISCSIADM_ABSTRACT_NAMESPACE
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0051-update-initscripts-and-docs.patch b/iscsi-initiator-utils/patches/0051-update-initscripts-and-docs.patch
deleted file mode 100644 (file)
index e2d4cdc..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-From c255c2cd43afeaefa428237a3200f02fb238d89e Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Mon, 19 Nov 2012 16:37:13 -0800
-Subject: update initscripts and docs
-
----
- README          |  9 +++------
- etc/iscsid.conf | 23 +++++++++++------------
- usr/idbm.c      |  4 ++++
- 3 files changed, 18 insertions(+), 18 deletions(-)
-
-diff --git a/README b/README
-index ec22098..2a8319a 100644
---- a/README
-+++ b/README
-@@ -74,11 +74,6 @@ the cache sync command will fail.
- - iscsiadm's -P 3 option will not print out scsi devices.
- - iscsid will not automatically online devices.
--You need to enable "Cryptographic API" under "Cryptographic options" in the
--kernel config. And you must enable "CRC32c CRC algorithm" even if
--you do not use header or data digests. They are the kernel options,
--CONFIG_CRYPTO and CONFIG_CRYPTO_CRC32C, respectively.
--
- By default the kernel's iSCSI modules will be used. Running:
-       make
-@@ -997,7 +992,7 @@ Red Hat or Fedora:
- -----------------
- To start open-iscsi in Red Hat/Fedora you can do:
--      service open-iscsi start
-+      service iscsi start
- To get open-iscsi to automatically start at run time you may have to
- run:
-@@ -1205,6 +1200,8 @@ iscsid will only perform rediscovery when it gets a SCN from the server.
- #   linux-isns (SLES's iSNS server) where it sometimes does not send SCN
- #   events in the proper format, so they may not get handled.
-+To set the startup value, so that nodes are not logged into automatically
-+use the value "manual".
- Example:
- --------
-diff --git a/etc/iscsid.conf b/etc/iscsid.conf
-index ef76dc0..ac1d231 100644
---- a/etc/iscsid.conf
-+++ b/etc/iscsid.conf
-@@ -17,10 +17,10 @@
- # maintainers.
- #
- # Default for Fedora and RHEL. (uncomment to activate).
--# iscsid.startup = /etc/rc.d/init.d/iscsid force-start
-+iscsid.startup = /etc/rc.d/init.d/iscsid force-start
- # 
- # Default for upstream open-iscsi scripts (uncomment to activate).
--iscsid.startup = /sbin/iscsid
-+# iscsid.startup = /sbin/iscsid
- #############################
-@@ -36,8 +36,8 @@ iscsid.startup = /sbin/iscsid
- # To request that the iscsi initd scripts startup a session set to "automatic".
- # node.startup = automatic
- #
--# To manually startup the session set to "manual". The default is manual.
--node.startup = manual
-+# To manually startup the session set to "manual". The default is automatic.
-+node.startup = automatic
- # For "automatic" startup nodes, setting this to "Yes" will try logins on each
- # available iface until one succeeds, and then stop.  The default "No" will try
-@@ -259,28 +259,27 @@ node.conn[0].iscsi.MaxXmitDataSegmentLength = 0
- discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768
- # To allow the targets to control the setting of the digest checking,
--# with the initiator requesting a preference of enabling the checking, uncomment# one or both of the following lines:
-+# with the initiator requesting a preference of enabling the checking, uncomment
-+# the following lines (Data digests are not supported.):
- #node.conn[0].iscsi.HeaderDigest = CRC32C,None
--#node.conn[0].iscsi.DataDigest = CRC32C,None
-+
- #
- # To allow the targets to control the setting of the digest checking,
- # with the initiator requesting a preference of disabling the checking,
--# uncomment one or both of the following lines:
-+# uncomment the following line:
- #node.conn[0].iscsi.HeaderDigest = None,CRC32C
--#node.conn[0].iscsi.DataDigest = None,CRC32C
- #
- # To enable CRC32C digest checking for the header and/or data part of
--# iSCSI PDUs, uncomment one or both of the following lines:
-+# iSCSI PDUs, uncomment the following line:
- #node.conn[0].iscsi.HeaderDigest = CRC32C
--#node.conn[0].iscsi.DataDigest = CRC32C
- #
- # To disable digest checking for the header and/or data part of
--# iSCSI PDUs, uncomment one or both of the following lines:
-+# iSCSI PDUs, uncomment the following line:
- #node.conn[0].iscsi.HeaderDigest = None
--#node.conn[0].iscsi.DataDigest = None
- #
- # The default is to never use DataDigests or HeaderDigests.
- #
-+node.conn[0].iscsi.HeaderDigest = None
- # For multipath configurations, you may want more than one session to be
- # created on each iface record.  If node.session.nr_sessions is greater
-diff --git a/usr/idbm.c b/usr/idbm.c
-index 4d30aa9..a1d7d37 100644
---- a/usr/idbm.c
-+++ b/usr/idbm.c
-@@ -399,9 +399,13 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri)
-                                IDBM_SHOW, "None", "CRC32C", "CRC32C,None",
-                                "None,CRC32C", num, 1);
-               sprintf(key, CONN_DATA_DIGEST, i);
-+
-+#if 0
-+We do not support data digests
-               __recinfo_int_o4(key, ri, r, conn[i].iscsi.DataDigest, IDBM_SHOW,
-                                "None", "CRC32C", "CRC32C,None",
-                                "None,CRC32C", num, 1);
-+#endif
-               sprintf(key, CONN_IFMARKER, i);
-               __recinfo_int_o2(key, ri, r, conn[i].iscsi.IFMarker, IDBM_SHOW,
-                               "No", "Yes", num, 1);
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0052-use-var-for-config.patch b/iscsi-initiator-utils/patches/0052-use-var-for-config.patch
deleted file mode 100644 (file)
index 1a76c11..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-From aaf2b26eae472e5fd596f9bd23f9bf5886b1eb98 Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Mon, 19 Nov 2012 16:38:45 -0800
-Subject: use var for config
-
----
- README         | 33 ++++++++++++++++-----------------
- doc/iscsiadm.8 |  8 ++++----
- usr/idbm.c     |  6 +++---
- usr/idbm.h     | 15 +++++++++------
- usr/iface.h    |  4 +++-
- 5 files changed, 35 insertions(+), 31 deletions(-)
-
-diff --git a/README b/README
-index 2a8319a..e5ae2c1 100644
---- a/README
-+++ b/README
-@@ -156,8 +156,7 @@ Usage: iscsid [OPTION]
- Open-iSCSI persistent configuration is stored in a number of
- directories under a configuration root directory, using a flat-file
--format. This configuration root directory is /etc/iscsi by default,
--but may also commonly be in /var/lib/iscsi.
-+format. This configuration root directory is /var/lib/iscsi by default.
- Configuration is contained in directories for:
-@@ -444,7 +443,7 @@ a scsi_host per HBA port).
- To manage both types of initiator stacks, iscsiadm uses the interface (iface)
- structure. For each HBA port or for software iscsi for each network
- device (ethX) or NIC, that you wish to bind sessions to you must create
--a iface config /etc/iscsi/ifaces.
-+a iface config /var/lib/iscsi/ifaces.
- Prep:
-@@ -478,29 +477,29 @@ Running:
- iface0 qla4xxx,00:c0:dd:08:63:e8,20.15.0.7,default,iqn.2005-06.com.redhat:madmax
- iface1 qla4xxx,00:c0:dd:08:63:ea,20.15.0.9,default,iqn.2005-06.com.redhat:madmax
--Will report iface configurations that are setup in /etc/iscsi/ifaces.
-+Will report iface configurations that are setup in /var/lib/iscsi/ifaces.
- The format is:
- iface_name transport_name,hwaddress,ipaddress,net_ifacename,initiatorname
- For software iscsi, you can create the iface configs by hand, but it is
- reccomended that you use iscsiadm's iface mode. There is a iface.example in
--/etc/iscsi/ifaces which can be used as a template for the daring.
-+/var/lib/iscsi/ifaces which can be used as a template for the daring.
- For each network object you wish to bind a session to you must create
--a seperate iface config in /etc/iscsi/ifaces and each iface config file
-+a seperate iface config in /var/lib/iscsi/ifaces and each iface config file
- must have a unique name which is less than or equal to 64 characters.
- Example:
- If you have NIC1 with MAC address 00:0F:1F:92:6B:BF and NIC2 with
- MAC address 00:C0:DD:08:63:E7 and you wanted to do software iscsi over
--TCP/IP. Then in /etc/iscsi/ifaces/iface0 you would enter:
-+TCP/IP. Then in /var/lib/iscsi/ifaces/iface0 you would enter:
- iface.transport_name = tcp
- iface.hwaddress = 00:0F:1F:92:6B:BF
--and in /etc/iscsi/ifaces/iface1 you would enter:
-+and in /var/lib/iscsi/ifaces/iface1 you would enter:
- iface.transport_name = tcp
- iface.hwaddress = 00:C0:DD:08:63:E7
-@@ -550,7 +549,7 @@ cxgb3i.00:07:43:05:97:07 cxgb3i,00:07:43:05:97:07,<empty>,<empty>,<empty>
- qla4xxx.00:0e:1e:04:8b:2e qla4xxx,00:0e:1e:04:8b:2e,<empty>,<empty>,<empty>
--Will report iface configurations that are setup in /etc/iscsi/ifaces.
-+Will report iface configurations that are setup in /var/lib/iscsi/ifaces.
- The format is:
- iface_name transport_name,hwaddress,ipaddress,net_ifacename,initiatorname
-@@ -636,7 +635,7 @@ need a seperate network connection to the target for discovery purposes.
- *This will be fixed in the next version of open-iscsi*
- For compatibility reasons, when you run iscsiadm to do discovery, it
--will check for interfaces in /etc/iscsi/iscsi/ifaces that are using
-+will check for interfaces in /var/lib/iscsi/ifaces that are using
- tcp for the iface.transport and it will bind the portals that are discovered
- so that they will be logged in through those ifaces. This behavior can also
- be overriden by passing in the interfaces you want to use. For the case
-@@ -654,7 +653,7 @@ we do not bind a session to a iface, then you can use the special iface
- iscsiadm -m discoverydb -t st -p ip:port -I default --discover -P 1
--And if you did not define any interfaces in /etc/iscsi/ifaces and do
-+And if you did not define any interfaces in /var/lib/iscsi/ifaces and do
- not pass anything into iscsiadm, running iscsiadm will do the default
- behavior, where we allow the network subsystem to decide which
- device to use.
-@@ -696,7 +695,7 @@ To now log into targets it is the same as with sofware iscsi. See section
-           ./iscsiadm -m discoverydb -t st -p 192.168.1.1:3260 --discover
--      This will search /etc/iscsi/send_targets for a record with the
-+      This will search /var/lib/iscsi/send_targets for a record with the
-       ID [portal = 192.168.1.1:3260 and type = sendtargets. If found it
-       will perform discovery using the settings stored in the record.
-       If a record does not exist, it will be created using the iscsid.conf
-@@ -705,7 +704,7 @@ To now log into targets it is the same as with sofware iscsi. See section
-       The argument to -p may also be a hostname instead of an address.
-           ./iscsiadm -m discoverydb -t st -p smoehost --discover
--      For the ifaces, iscsiadm will first search /etc/iscsi/ifaces for
-+      For the ifaces, iscsiadm will first search /var/lib/iscsi/ifaces for
-       interfaces using software iscsi. If any are found then nodes found
-       during discovery will be setup so that they can logged in through
-       those interfaces. To specify a specific iface, pass the
-@@ -761,7 +760,7 @@ To now log into targets it is the same as with sofware iscsi. See section
-       This command will perform discovery, but not manipulate the node DB.
-   - SendTargets iSCSI Discovery with a specific interface. If you
--      wish to only use a subset of the interfaces in /etc/iscsi/ifaces
-+      wish to only use a subset of the interfaces in /var/lib/iscsi/ifaces
-       then you can pass them in during discovery:
-            ./iscsiadm -m discoverydb -t sendtargets -p 192.168.1.1:3260 \
-@@ -1072,8 +1071,8 @@ where targetname is the name of the target and ip_address:port is the address
- and port of the portal. tpgt, is the portal group tag of
- the portal, and is not used in iscsiadm commands except for static
- record creation. And iface name is the name of the iscsi interface
--defined in /etc/iscsi/ifaces. If no interface was defined in
--/etc/iscsi/ifaces or passed in, the default behavior is used.
-+defined in /var/lib/iscsi/ifaces. If no interface was defined in
-+/var/lib/iscsi/ifaces or passed in, the default behavior is used.
- Default here is iscsi_tcp/tcp to be used over which ever NIC the
- network layer decides is best.
-@@ -1188,7 +1187,7 @@ If set, iscsid will perform discovery to the address every
- discovery.isns.discoveryd_poll_inval or
- discovery.sendtargets.discoveryd_poll_inval seconds,
- and it will log into any portals found from the discovery source using
--the ifaces in /etc/iscsi/ifaces.
-+the ifaces in /var/lib/iscsi/ifaces.
- Note that for iSNS the poll_interval does not have to be set. If not set,
- iscsid will only perform rediscovery when it gets a SCN from the server.
-diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8
-index 7c209f6..e94cca0 100644
---- a/doc/iscsiadm.8
-+++ b/doc/iscsiadm.8
-@@ -89,7 +89,7 @@ This option is only valid for ping submode.
- .TP
- \fB\-I\fR, \fB\-\-interface=\fI[iface]\fR
- The interface argument specifies the iSCSI interface to use for the operation.
--iSCSI interfaces (iface) are defined in /etc/iscsi/ifaces. For hardware
-+iSCSI interfaces (iface) are defined in /var/lib/iscsi/ifaces. For hardware
- iSCSI (qla4xxx) the iface config must have the hardware address
- (iface.hwaddress = port's MAC address)
- and the driver/transport_name (iface.transport_name). The iface's name is
-@@ -166,7 +166,7 @@ If no other options are specified: for \fIdiscoverydb\fR and \fInode\fR, all
- of their respective records are displayed; for \fIsession\fR, all active
- sessions and connections are displayed; for \fIfw\fR, all boot firmware
- values are displayed; for \fIhost\fR, all iSCSI hosts are displayed; and
--for \fIiface\fR, all ifaces setup in /etc/iscsi/ifaces are displayed.
-+for \fIiface\fR, all ifaces setup in /var/lib/iscsi/ifaces are displayed.
- .TP
- \fB\-n\fR, \fB\-\-name=\fIname\fR
-@@ -535,10 +535,10 @@ The configuration file read by \fBiscsid\fR and \fBiscsiadm\fR on startup.
- The file containing the iSCSI InitiatorName and InitiatorAlias read by
- \fBiscsid\fR and \fBiscsiadm\fR on startup.
- .TP
--/etc/iscsi/nodes/
-+/var/lib/iscsi/nodes/
- This directory contains the nodes with their targets.
- .TP
--/etc/iscsi/send_targets
-+/var/lib/iscsi/send_targets
- This directory contains the portals.
- .SH "SEE ALSO"
-diff --git a/usr/idbm.c b/usr/idbm.c
-index a1d7d37..806d90e 100644
---- a/usr/idbm.c
-+++ b/usr/idbm.c
-@@ -2472,9 +2472,9 @@ free_info:
- int idbm_init(idbm_get_config_file_fn *fn)
- {
-       /* make sure root db dir is there */
--      if (access(ISCSI_CONFIG_ROOT, F_OK) != 0) {
--              if (mkdir(ISCSI_CONFIG_ROOT, 0660) != 0) {
--                      log_error("Could not make %s %d\n", ISCSI_CONFIG_ROOT,
-+      if (access(ISCSIVAR, F_OK) != 0) {
-+              if (mkdir(ISCSIVAR, 0660) != 0) {
-+                      log_error("Could not make %s %d\n", ISCSIVAR,
-                                  errno);
-                       return errno;
-               }
-diff --git a/usr/idbm.h b/usr/idbm.h
-index 245f046..5d81df7 100644
---- a/usr/idbm.h
-+++ b/usr/idbm.h
-@@ -28,12 +28,15 @@
- #include "config.h"
- #include "list.h"
--#define NODE_CONFIG_DIR               ISCSI_CONFIG_ROOT"nodes"
--#define SLP_CONFIG_DIR                ISCSI_CONFIG_ROOT"slp"
--#define ISNS_CONFIG_DIR               ISCSI_CONFIG_ROOT"isns"
--#define STATIC_CONFIG_DIR     ISCSI_CONFIG_ROOT"static"
--#define FW_CONFIG_DIR         ISCSI_CONFIG_ROOT"fw"
--#define ST_CONFIG_DIR         ISCSI_CONFIG_ROOT"send_targets"
-+#define ISCSIVAR              "/var/lib/iscsi/"
-+
-+#define NODE_CONFIG_DIR               ISCSIVAR"nodes"
-+#define SLP_CONFIG_DIR                ISCSIVAR"slp"
-+#define ISNS_CONFIG_DIR               ISCSIVAR"isns"
-+#define STATIC_CONFIG_DIR     ISCSIVAR"static"
-+#define ST_CONFIG_DIR         ISCSIVAR"send_targets"
-+#define FW_CONFIG_DIR         ISCSIVAR"fw"
-+
- #define ST_CONFIG_NAME                "st_config"
- #define ISNS_CONFIG_NAME      "isns_config"
-diff --git a/usr/iface.h b/usr/iface.h
-index 01f7074..f396918 100644
---- a/usr/iface.h
-+++ b/usr/iface.h
-@@ -20,7 +20,9 @@
- #ifndef ISCSI_IFACE_H
- #define ISCSI_IFACE_H
--#define IFACE_CONFIG_DIR      ISCSI_CONFIG_ROOT"ifaces"
-+#include "idbm.h"
-+
-+#define IFACE_CONFIG_DIR      ISCSIVAR"ifaces"
- struct iface_rec;
- struct list_head;
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0053-use-red-hat-for-name.patch b/iscsi-initiator-utils/patches/0053-use-red-hat-for-name.patch
deleted file mode 100644 (file)
index 8888200..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From bf7f9118ab2f1a5302dafa198d3351f6f977b7bd Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Mon, 19 Nov 2012 16:40:04 -0800
-Subject: use red hat for name
-
----
- utils/iscsi-iname.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/utils/iscsi-iname.c b/utils/iscsi-iname.c
-index 6347edc..cb2f6c8 100644
---- a/utils/iscsi-iname.c
-+++ b/utils/iscsi-iname.c
-@@ -73,7 +73,7 @@ main(int argc, char *argv[])
-                       exit(0);
-               }
-       } else {
--              prefix = "iqn.2005-03.org.open-iscsi";
-+              prefix = "iqn.1994-05.com.redhat";
-       }
-       /* try to feed some entropy from the pool to MD5 in order to get
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0054-add-libiscsi.patch b/iscsi-initiator-utils/patches/0054-add-libiscsi.patch
deleted file mode 100644 (file)
index 44fcf4a..0000000
+++ /dev/null
@@ -1,3927 +0,0 @@
-From ce1f29f2049320af18eeffd3aefccf840c442ce0 Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Mon, 19 Nov 2012 16:43:15 -0800
-Subject: add libiscsi
-
----
- Makefile                                    |    2 +
- libiscsi/Makefile                           |   61 ++
- libiscsi/libiscsi.c                         |  620 +++++++++++
- libiscsi/libiscsi.doxy                      | 1473 +++++++++++++++++++++++++++
- libiscsi/libiscsi.h                         |  344 +++++++
- libiscsi/pylibiscsi.c                       |  638 ++++++++++++
- libiscsi/setup.py                           |    9 +
- libiscsi/tests/test_discovery_firmware.c    |   53 +
- libiscsi/tests/test_discovery_sendtargets.c |   60 ++
- libiscsi/tests/test_get_auth.c              |   70 ++
- libiscsi/tests/test_get_initiator_name.c    |   38 +
- libiscsi/tests/test_get_network_config.c    |   45 +
- libiscsi/tests/test_login.c                 |   52 +
- libiscsi/tests/test_logout.c                |   51 +
- libiscsi/tests/test_params.c                |  103 ++
- libiscsi/tests/test_set_auth.c              |   58 ++
- usr/Makefile                                |    2 +-
- usr/discovery.c                             |    5 +
- usr/idbm.c                                  |    6 +-
- usr/idbm.h                                  |    3 +
- usr/iscsi_ipc.h                             |    2 +
- 21 files changed, 3691 insertions(+), 4 deletions(-)
- create mode 100644 libiscsi/Makefile
- create mode 100644 libiscsi/libiscsi.c
- create mode 100644 libiscsi/libiscsi.doxy
- create mode 100644 libiscsi/libiscsi.h
- create mode 100644 libiscsi/pylibiscsi.c
- create mode 100644 libiscsi/setup.py
- create mode 100644 libiscsi/tests/test_discovery_firmware.c
- create mode 100644 libiscsi/tests/test_discovery_sendtargets.c
- create mode 100644 libiscsi/tests/test_get_auth.c
- create mode 100644 libiscsi/tests/test_get_initiator_name.c
- create mode 100644 libiscsi/tests/test_get_network_config.c
- create mode 100644 libiscsi/tests/test_login.c
- create mode 100644 libiscsi/tests/test_logout.c
- create mode 100644 libiscsi/tests/test_params.c
- create mode 100644 libiscsi/tests/test_set_auth.c
-
-diff --git a/Makefile b/Makefile
-index c5d9700..6dfbde3 100644
---- a/Makefile
-+++ b/Makefile
-@@ -32,6 +32,7 @@ user: utils/open-isns/Makefile
-       $(MAKE) -C utils/fwparam_ibft
-       $(MAKE) -C usr
-       $(MAKE) -C utils
-+      $(MAKE) -C libiscsi
-       @echo
-       @echo "Compilation complete                 Output file"
-       @echo "-----------------------------------  ----------------"
-@@ -56,6 +57,7 @@ kernel: force
- force: ;
- clean:
-+      $(MAKE) -C libiscsi clean
-       $(MAKE) -C utils/sysdeps clean
-       $(MAKE) -C utils/fwparam_ibft clean
-       $(MAKE) -C utils clean
-diff --git a/libiscsi/Makefile b/libiscsi/Makefile
-new file mode 100644
-index 0000000..317a7ec
---- /dev/null
-+++ b/libiscsi/Makefile
-@@ -0,0 +1,61 @@
-+# This Makefile will work only with GNU make.
-+
-+OSNAME=$(shell uname -s)
-+OPTFLAGS ?= -O2 -g
-+WARNFLAGS ?= -Wall -Wstrict-prototypes
-+CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I../include -I../usr \
-+              -D$(OSNAME) -fPIC -D_GNU_SOURCE -fvisibility=hidden
-+LIB = libiscsi.so.0
-+TESTS = tests/test_discovery_sendtargets tests/test_discovery_firmware
-+TESTS += tests/test_login tests/test_logout tests/test_params
-+TESTS += tests/test_get_network_config tests/test_get_initiator_name
-+TESTS += tests/test_set_auth tests/test_get_auth
-+
-+COMMON_SRCS = sysdeps.o
-+# sources shared between iscsid, iscsiadm and iscsistart
-+ISCSI_LIB_SRCS = netlink.o transport.o cxgbi.o be2iscsi.o iscsi_timer.o initiator_common.o iscsi_err.o session_info.o iscsi_util.o io.o auth.o discovery.o login.o log.o md5.o sha1.o iface.o idbm.o sysfs.o iscsi_sysfs.o iscsi_net_util.o iscsid_req.o iser.o uip_mgmt_ipc.o
-+FW_PARAM_SRCS = fw_entry.o prom_lex.o prom_parse.tab.o fwparam_ppc.o fwparam_sysfs.o
-+
-+# sources shared with the userspace utils, note we build these separately
-+# to get PIC versions.
-+COMMON_OBJS = $(patsubst %.o, common-objs/%.o, $(COMMON_SRCS))
-+USR_OBJS = $(patsubst %.o, usr-objs/%.o, $(ISCSI_LIB_SRCS) strings.o)
-+FW_OBJS = $(patsubst %.o, fw-objs/%.o, $(FW_PARAM_SRCS))
-+
-+# Flags for the tests
-+tests/% : CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I.
-+
-+all: lib tests html
-+
-+lib: $(LIB)
-+tests: $(TESTS)
-+
-+common-objs/%.o: ../utils/sysdeps/%.c
-+      mkdir -p common-objs
-+      $(CC) $(CFLAGS) -c $< -o $@
-+
-+usr-objs/%.o: ../usr/%.c
-+      mkdir -p usr-objs
-+      $(CC) $(CFLAGS) -c $< -o $@
-+
-+fw-objs/%.o: ../utils/fwparam_ibft/%.c
-+      mkdir -p fw-objs
-+      $(CC) $(CFLAGS) -c $< -o $@
-+
-+$(LIB): $(COMMON_OBJS) $(FW_OBJS) $(USR_OBJS) libiscsi.o
-+      $(CC) $(CFLAGS) -shared -Wl,-soname,$(LIB) $^ -o $@
-+      ln -s -f $(LIB) libiscsi.so
-+
-+$(TESTS): $(FW_OBJS) $(COMMON_OBJS) $(USR_OBJS) $(LIB)
-+
-+html: libiscsi.h libiscsi.doxy
-+      doxygen libiscsi.doxy
-+
-+clean:
-+      rm -rf *.o common-objs usr-objs fw-objs libuip-objs libiscsi.so* \
-+                      .depend *~ html $(TESTS) tests/*~
-+
-+depend:
-+      gcc $(CFLAGS) -M `ls *.c` > .depend
-+
-+-include .depend ../usr/.depend
-diff --git a/libiscsi/libiscsi.c b/libiscsi/libiscsi.c
-new file mode 100644
-index 0000000..2a176e8
---- /dev/null
-+++ b/libiscsi/libiscsi.c
-@@ -0,0 +1,620 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <errno.h>
-+#include <unistd.h>
-+#include <sys/syslog.h>
-+#include "libiscsi.h"
-+#include "idbm.h"
-+#include "discovery.h"
-+#include "log.h"
-+#include "sysfs.h"
-+#include "iscsi_sysfs.h"
-+#include "session_info.h"
-+#include "iscsi_util.h"
-+#include "sysdeps.h"
-+#include "iface.h"
-+#include "iscsi_proto.h"
-+#include "fw_context.h"
-+#include "iscsid_req.h"
-+#include "iscsi_err.h"
-+
-+#define CHECK(a) { context->error_str[0] = 0; rc = a; if (rc) goto leave; }
-+
-+/* UGLY, not thread safe :( */
-+static int sysfs_initialized = 0;
-+
-+struct libiscsi_context {
-+      char error_str[256];
-+      /* For get_parameter_helper() */
-+      const char *parameter;
-+      char *value;
-+};
-+
-+static void libiscsi_log(int prio, void *priv, const char *fmt, va_list ap)
-+{
-+      struct libiscsi_context *context = priv;
-+
-+      if (prio > LOG_ERR) /* We are only interested in errors (or worse) */
-+              return;
-+
-+      vsnprintf(context->error_str, sizeof(context->error_str), fmt, ap);
-+}
-+
-+struct libiscsi_context *libiscsi_init(void)
-+{
-+      struct libiscsi_context *context;
-+
-+      context = calloc(1, sizeof *context);
-+      if (!context)
-+              return NULL;
-+
-+      log_init("libiscsi", 1024, libiscsi_log, context);
-+      if (!sysfs_initialized) {
-+              sysfs_init();
-+              sysfs_initialized = 1;
-+      }
-+      increase_max_files();
-+      if (idbm_init(NULL)) {
-+              sysfs_cleanup();
-+              free(context);
-+              return NULL;
-+      }
-+
-+      iface_setup_host_bindings();
-+
-+      return context;
-+}
-+
-+void libiscsi_cleanup(struct libiscsi_context *context)
-+{
-+      idbm_terminate();
-+      free_transports();
-+      sysfs_cleanup();
-+      free(context);
-+}
-+
-+static void free_iface_list(struct list_head *ifaces)
-+{
-+      struct iface_rec *iface, *tmp_iface;
-+
-+      list_for_each_entry_safe(iface, tmp_iface, ifaces, list) {
-+              list_del(&iface->list);
-+              free(iface);
-+      }
-+}
-+
-+static void free_rec_list(struct list_head *rec_list)
-+{
-+      struct node_rec *rec, *tmp;
-+      
-+      list_for_each_entry_safe(rec, tmp, rec_list, list) {
-+              list_del(&rec->list);
-+              free(rec);
-+      }
-+}
-+
-+int libiscsi_discover_sendtargets(struct libiscsi_context *context,
-+      const char *address, int port,
-+      const struct libiscsi_auth_info *auth_info,
-+      int *nr_found, struct libiscsi_node **found_nodes)
-+{
-+      struct discovery_rec drec;
-+      LIST_HEAD(bound_rec_list);
-+      struct node_rec *rec;
-+      int rc = 0, found = 0;
-+
-+      INIT_LIST_HEAD(&bound_rec_list);
-+
-+      if (nr_found)
-+              *nr_found = 0;
-+      if (found_nodes)
-+              *found_nodes = NULL;
-+
-+      CHECK(libiscsi_verify_auth_info(context, auth_info))
-+
-+      /* Fill the drec struct with all needed info */
-+      memset(&drec, 0, sizeof drec);
-+      idbm_sendtargets_defaults(&drec.u.sendtargets);
-+      drec.type = DISCOVERY_TYPE_SENDTARGETS;
-+      strlcpy(drec.address, address, sizeof(drec.address));
-+      drec.port = port ? port : ISCSI_LISTEN_PORT;
-+      switch(auth_info ? auth_info->method : libiscsi_auth_none) {
-+      case libiscsi_auth_chap:
-+              drec.u.sendtargets.auth.authmethod = AUTH_METHOD_CHAP;
-+              strlcpy(drec.u.sendtargets.auth.username,
-+                      auth_info->chap.username, AUTH_STR_MAX_LEN);
-+              strlcpy((char *)drec.u.sendtargets.auth.password,
-+                      auth_info->chap.password, AUTH_STR_MAX_LEN);
-+              drec.u.sendtargets.auth.password_length =
-+                      strlen((char *)drec.u.sendtargets.auth.password);
-+              strlcpy(drec.u.sendtargets.auth.username_in,
-+                      auth_info->chap.reverse_username, AUTH_STR_MAX_LEN);
-+              strlcpy((char *)drec.u.sendtargets.auth.password_in,
-+                      auth_info->chap.reverse_password, AUTH_STR_MAX_LEN);
-+              drec.u.sendtargets.auth.password_in_length =
-+                      strlen((char *)drec.u.sendtargets.auth.password_in);
-+              break;
-+      }
-+
-+      CHECK(idbm_add_discovery(&drec))
-+
-+      CHECK(idbm_bind_ifaces_to_nodes(discovery_sendtargets,
-+                                      &drec, NULL, &bound_rec_list))
-+
-+      /* now add/update records */
-+      list_for_each_entry(rec, &bound_rec_list, list) {
-+              CHECK(idbm_add_node(rec, &drec, 1 /* overwrite */))
-+              found++;
-+      }
-+
-+      if (nr_found)
-+              *nr_found = found;
-+
-+      if (found_nodes && found) {
-+              *found_nodes = calloc(found, sizeof **found_nodes);
-+              if (*found_nodes == NULL) {
-+                      snprintf(context->error_str,
-+                               sizeof(context->error_str), strerror(ENOMEM));
-+                      rc = ENOMEM;
-+                      goto leave;
-+              }
-+              found = 0;
-+              list_for_each_entry(rec, &bound_rec_list, list) {
-+                      strlcpy((*found_nodes)[found].name, rec->name,
-+                               LIBISCSI_VALUE_MAXLEN);
-+                      (*found_nodes)[found].tpgt = rec->tpgt;
-+                      strlcpy((*found_nodes)[found].address,
-+                               rec->conn[0].address, NI_MAXHOST);
-+                      (*found_nodes)[found].port = rec->conn[0].port;
-+                      strlcpy((*found_nodes)[found].iface,
-+                               rec->iface.name, LIBISCSI_VALUE_MAXLEN);
-+                      found++;
-+              }
-+      }
-+
-+leave:
-+      free_rec_list(&bound_rec_list);
-+      return rc;
-+}
-+
-+int libiscsi_discover_firmware(struct libiscsi_context *context,
-+      int *nr_found, struct libiscsi_node **found_nodes)
-+{
-+      struct list_head targets, ifaces, rec_list;
-+      discovery_rec_t drec;
-+      int rc = 0;
-+
-+      INIT_LIST_HEAD(&targets);
-+      INIT_LIST_HEAD(&ifaces);
-+      INIT_LIST_HEAD(&rec_list);
-+
-+      if (nr_found) {
-+              *nr_found = 0;
-+      }
-+
-+      if (found_nodes) {
-+              *found_nodes = NULL;
-+      }
-+
-+      rc = fw_get_targets(&targets);
-+      if (rc) {
-+              log_error("%s: Could not get list of targets from firmware "
-+                        "(err %d).\n", __func__, rc);
-+              return rc;
-+      }
-+
-+      CHECK(iface_create_ifaces_from_boot_contexts(&ifaces, &targets));
-+
-+      memset(&drec, 0, sizeof(drec));
-+      drec.type = DISCOVERY_TYPE_FW;
-+      rc = idbm_bind_ifaces_to_nodes(discovery_fw, &drec, &ifaces, &rec_list);
-+      if (rc) {
-+              log_error("%s: Could not determine target nodes from firmware "
-+                        "(err %d).\n", __func__, rc);
-+              goto leave;
-+      }
-+
-+      int node_count = 0;
-+      struct list_head *pos;
-+      list_for_each(pos, &rec_list) {
-+              ++node_count;
-+      }
-+
-+      struct libiscsi_node* new_nodes;
-+      /* allocate enough space for all the nodes */
-+      new_nodes = calloc(node_count, sizeof *new_nodes);
-+      if (new_nodes == NULL) {
-+              rc = ENOMEM;
-+              log_error("%s: %s.\n", __func__, strerror(ENOMEM));
-+              goto leave;
-+      }
-+
-+      struct node_rec *rec;
-+      struct libiscsi_node *new_node = new_nodes;
-+      /* in one loop, add nodes to idbm and create libiscsi_node entries */
-+      list_for_each_entry(rec, &rec_list, list) {
-+              CHECK(idbm_add_node(rec, NULL, 1 /* overwrite */));
-+
-+              strlcpy(new_node->name, rec->name, LIBISCSI_VALUE_MAXLEN);
-+              new_node->tpgt = rec->tpgt;
-+              strlcpy(new_node->address, rec->conn[0].address, NI_MAXHOST);
-+              new_node->port = rec->conn[0].port;
-+              strlcpy(new_node->iface, rec->iface.name, LIBISCSI_VALUE_MAXLEN);
-+
-+              ++new_node;
-+      }
-+
-+      /* update output parameters */
-+      if (nr_found) {
-+              *nr_found = node_count;
-+      }
-+      if (found_nodes) {
-+              *found_nodes = new_nodes;
-+      }
-+
-+leave:
-+      fw_free_targets(&targets);
-+
-+      free_iface_list(&ifaces);
-+      free_rec_list(&rec_list);
-+
-+      return rc;
-+}
-+
-+int libiscsi_verify_auth_info(struct libiscsi_context *context,
-+      const struct libiscsi_auth_info *auth_info)
-+{
-+      switch(auth_info ? auth_info->method : libiscsi_auth_none) {
-+      case libiscsi_auth_none:
-+              break;
-+      case libiscsi_auth_chap:
-+              if (!auth_info->chap.username[0]) {
-+                      strcpy(context->error_str, "Empty username");
-+                      return EINVAL;
-+              }
-+              if (!auth_info->chap.password[0]) {
-+                      strcpy(context->error_str, "Empty password");
-+                      return EINVAL;
-+              }
-+              if (auth_info->chap.reverse_username[0] &&
-+                  !auth_info->chap.reverse_password[0]) {
-+                      strcpy(context->error_str, "Empty reverse password");
-+                      return EINVAL;
-+              }
-+              break;
-+      default:
-+              sprintf(context->error_str,
-+                      "Invalid authentication method: %d",
-+                      (int)auth_info->method);
-+              return EINVAL;
-+      }
-+      return 0;
-+}
-+
-+int libiscsi_node_set_auth(struct libiscsi_context *context,
-+    const struct libiscsi_node *node,
-+    const struct libiscsi_auth_info *auth_info)
-+{
-+      int rc = 0;
-+
-+      CHECK(libiscsi_verify_auth_info(context, auth_info))
-+
-+      switch(auth_info ? auth_info->method : libiscsi_auth_none) {
-+      case libiscsi_auth_none:
-+              CHECK(libiscsi_node_set_parameter(context, node,
-+                      "node.session.auth.authmethod", "None"))
-+              CHECK(libiscsi_node_set_parameter(context, node,
-+                      "node.session.auth.username", ""))
-+              CHECK(libiscsi_node_set_parameter(context, node,
-+                      "node.session.auth.password", ""))
-+              CHECK(libiscsi_node_set_parameter(context, node,
-+                      "node.session.auth.username_in", ""))
-+              CHECK(libiscsi_node_set_parameter(context, node,
-+                      "node.session.auth.password_in", ""))
-+              break;
-+
-+      case libiscsi_auth_chap:
-+              CHECK(libiscsi_node_set_parameter(context, node,
-+                      "node.session.auth.authmethod", "CHAP"))
-+              CHECK(libiscsi_node_set_parameter(context, node,
-+                      "node.session.auth.username",
-+                      auth_info->chap.username))
-+              CHECK(libiscsi_node_set_parameter(context, node,
-+                      "node.session.auth.password",
-+                      auth_info->chap.password))
-+              CHECK(libiscsi_node_set_parameter(context, node,
-+                      "node.session.auth.username_in",
-+                      auth_info->chap.reverse_username))
-+              CHECK(libiscsi_node_set_parameter(context, node,
-+                      "node.session.auth.password_in",
-+                      auth_info->chap.reverse_password))
-+              break;
-+      }
-+leave:
-+      return rc;
-+}
-+
-+int libiscsi_node_get_auth(struct libiscsi_context *context,
-+    const struct libiscsi_node *node,
-+    struct libiscsi_auth_info *auth_info)
-+{
-+      int rc = 0;
-+      char value[LIBISCSI_VALUE_MAXLEN];
-+
-+      memset(auth_info, 0, sizeof *auth_info);
-+
-+      CHECK(libiscsi_node_get_parameter(context, node,
-+                      "node.session.auth.authmethod", value))
-+
-+      if (!strcmp(value, "None")) {
-+              auth_info->method = libiscsi_auth_none;
-+      } else if (!strcmp(value, "CHAP")) {
-+              auth_info->method = libiscsi_auth_chap;
-+              CHECK(libiscsi_node_get_parameter(context, node,
-+                      "node.session.auth.username",
-+                      auth_info->chap.username))
-+              CHECK(libiscsi_node_get_parameter(context, node,
-+                      "node.session.auth.password",
-+                      auth_info->chap.password))
-+              CHECK(libiscsi_node_get_parameter(context, node,
-+                      "node.session.auth.username_in",
-+                      auth_info->chap.reverse_username))
-+              CHECK(libiscsi_node_get_parameter(context, node,
-+                      "node.session.auth.password_in",
-+                      auth_info->chap.reverse_password))
-+      } else {
-+              snprintf(context->error_str, sizeof(context->error_str),
-+                       "unknown authentication method: %s", value);
-+              rc = EINVAL;
-+      }
-+leave:
-+      return rc;
-+}
-+
-+static void node_to_rec(const struct libiscsi_node *node,
-+      struct node_rec *rec)
-+{
-+      memset(rec, 0, sizeof *rec);
-+      idbm_node_setup_defaults(rec);
-+      strlcpy(rec->name, node->name, TARGET_NAME_MAXLEN);
-+      rec->tpgt = node->tpgt;
-+      strlcpy(rec->conn[0].address, node->address, NI_MAXHOST);
-+      rec->conn[0].port = node->port;
-+}
-+
-+int login_helper(void *data, node_rec_t *rec)
-+{
-+      char *iface = (char*)data;
-+      if (strcmp(iface, rec->iface.name))
-+              /* different iface, skip it */
-+              return -1;
-+
-+      int rc = iscsid_req_by_rec(MGMT_IPC_SESSION_LOGIN, rec);
-+      if (rc) {
-+              iscsi_err_print_msg(rc);
-+              rc = ENOTCONN;
-+      }
-+      return rc;
-+}
-+
-+int libiscsi_node_login(struct libiscsi_context *context,
-+      const struct libiscsi_node *node)
-+{
-+      int nr_found = 0, rc;
-+
-+      CHECK(idbm_for_each_iface(&nr_found, (void*)node->iface, login_helper,
-+              (char *)node->name, node->tpgt,
-+              (char *)node->address, node->port))
-+      if (nr_found == 0) {
-+              strcpy(context->error_str, "No such node");
-+              rc = ENODEV;
-+      }
-+leave:
-+      return rc;
-+}
-+
-+static int logout_helper(void *data, struct session_info *info)
-+{
-+      int rc;
-+      struct node_rec *rec = data;
-+
-+      if (!iscsi_match_session(rec, info))
-+              /* Tell iscsi_sysfs_for_each_session this session was not a
-+                 match so that it will not increase nr_found. */
-+              return -1;
-+
-+      rc = iscsid_req_by_sid(MGMT_IPC_SESSION_LOGOUT, info->sid);
-+      if (rc) {
-+              iscsi_err_print_msg(rc);
-+              rc = EIO;
-+      }
-+
-+      return rc;
-+}
-+
-+int libiscsi_node_logout(struct libiscsi_context *context,
-+      const struct libiscsi_node *node)
-+{
-+      int nr_found = 0, rc;
-+      struct node_rec rec;
-+
-+      node_to_rec(node, &rec);
-+      CHECK(iscsi_sysfs_for_each_session(&rec, &nr_found, logout_helper))
-+      if (nr_found == 0) {
-+              strcpy(context->error_str, "No matching session");
-+              rc = ENODEV;
-+      }
-+leave:
-+      return rc;
-+}
-+
-+int libiscsi_node_set_parameter(struct libiscsi_context *context,
-+      const struct libiscsi_node *node,
-+      const char *parameter, const char *value)
-+{
-+      int nr_found = 0, rc;
-+      struct user_param *param;
-+      struct list_head params;
-+
-+      INIT_LIST_HEAD(&params);
-+      param = idbm_alloc_user_param(parameter, value);
-+      if (!param) {
-+              rc = ENOMEM;
-+              goto leave;
-+      }
-+      list_add_tail(&params, &param->list);
-+
-+      CHECK(idbm_for_each_iface(&nr_found, &params, idbm_node_set_param,
-+              (char *)node->name, node->tpgt,
-+              (char *)node->address, node->port))
-+      if (nr_found == 0) {
-+              strcpy(context->error_str, "No such node");
-+              rc = ENODEV;
-+      }
-+      free(param->name);
-+      free(param);
-+leave:
-+      return rc;
-+}
-+
-+static int get_parameter_helper(void *data, node_rec_t *rec)
-+{
-+      struct libiscsi_context *context = data;
-+      recinfo_t *info;
-+      int i;
-+
-+      info = idbm_recinfo_alloc(MAX_KEYS);
-+      if (!info) {
-+              snprintf(context->error_str, sizeof(context->error_str),
-+                       strerror(ENOMEM));
-+              return ENOMEM;
-+      }
-+
-+      idbm_recinfo_node(rec, info);
-+
-+      for (i = 0; i < MAX_KEYS; i++) {
-+              if (!info[i].visible)
-+                      continue;
-+
-+              if (strcmp(context->parameter, info[i].name))
-+                      continue;
-+
-+              strlcpy(context->value, info[i].value, LIBISCSI_VALUE_MAXLEN);
-+              break;
-+      }
-+
-+      free(info);
-+
-+      if (i == MAX_KEYS) {
-+              strcpy(context->error_str, "No such parameter");
-+              return EINVAL;
-+      }
-+
-+      return 0;
-+}
-+
-+int libiscsi_node_get_parameter(struct libiscsi_context *context,
-+      const struct libiscsi_node *node, const char *parameter, char *value)
-+{
-+      int nr_found = 0, rc = 0;
-+
-+      context->parameter = parameter;
-+      context->value = value;
-+
-+      /* Note we assume there is only one interface, if not we will get
-+         the value from the last interface iterated over!
-+         This (multiple interfaces) can only happen if someone explicitly
-+         created ones using iscsiadm. Even then this should not be a problem
-+         as most settings should be the same independent of the iface. */
-+      CHECK(idbm_for_each_iface(&nr_found, context, get_parameter_helper,
-+              (char *)node->name, node->tpgt,
-+              (char *)node->address, node->port))
-+      if (nr_found == 0) {
-+              strcpy(context->error_str, "No such node");
-+              rc = ENODEV;
-+      }
-+leave:
-+      return rc;
-+}
-+
-+const char *libiscsi_get_error_string(struct libiscsi_context *context)
-+{
-+      /* Sometimes the core open-iscsi code does not give us an error
-+         message */
-+      if (!context->error_str[0])
-+              return "Unknown error";
-+
-+      return context->error_str;
-+}
-+
-+
-+/************************** Utility functions *******************************/
-+
-+int libiscsi_get_firmware_network_config(
-+    struct libiscsi_network_config *config)
-+{
-+      struct boot_context fw_entry;
-+
-+      if (!sysfs_initialized) {
-+              sysfs_init();
-+              sysfs_initialized = 1;
-+      }
-+
-+      memset(config, 0, sizeof *config);
-+      memset(&fw_entry, 0, sizeof fw_entry);
-+      if (fw_get_entry(&fw_entry))
-+              return ENODEV;
-+
-+      config->dhcp = strlen(fw_entry.dhcp) ? 1 : 0;
-+      strncpy(config->iface_name, fw_entry.iface, sizeof fw_entry.iface);
-+      strncpy(config->mac_address, fw_entry.mac, sizeof fw_entry.mac);
-+      strncpy(config->ip_address, fw_entry.ipaddr, sizeof fw_entry.ipaddr);
-+      strncpy(config->netmask, fw_entry.mask, sizeof fw_entry.mask);
-+      strncpy(config->gateway, fw_entry.gateway, sizeof fw_entry.gateway);
-+      strncpy(config->primary_dns, fw_entry.primary_dns,
-+              sizeof fw_entry.primary_dns);
-+      strncpy(config->secondary_dns, fw_entry.secondary_dns,
-+              sizeof fw_entry.secondary_dns);
-+      return 0;
-+}
-+
-+int libiscsi_get_firmware_initiator_name(char *initiatorname)
-+{
-+      struct boot_context fw_entry;
-+
-+      if (!sysfs_initialized) {
-+              sysfs_init();
-+              sysfs_initialized = 1;
-+      }
-+
-+      memset(initiatorname, 0, LIBISCSI_VALUE_MAXLEN);
-+      memset(&fw_entry, 0, sizeof fw_entry);
-+      if (fw_get_entry(&fw_entry))
-+              return ENODEV;
-+
-+      strncpy(initiatorname, fw_entry.initiatorname,
-+              sizeof fw_entry.initiatorname);
-+
-+      return 0;
-+}
-diff --git a/libiscsi/libiscsi.doxy b/libiscsi/libiscsi.doxy
-new file mode 100644
-index 0000000..663770f
---- /dev/null
-+++ b/libiscsi/libiscsi.doxy
-@@ -0,0 +1,1473 @@
-+# Doxyfile 1.5.7.1
-+
-+# This file describes the settings to be used by the documentation system
-+# doxygen (www.doxygen.org) for a project
-+#
-+# All text after a hash (#) is considered a comment and will be ignored
-+# The format is:
-+#       TAG = value [value, ...]
-+# For lists items can also be appended using:
-+#       TAG += value [value, ...]
-+# Values that contain spaces should be placed between quotes (" ")
-+
-+#---------------------------------------------------------------------------
-+# Project related configuration options
-+#---------------------------------------------------------------------------
-+
-+# This tag specifies the encoding used for all characters in the config file 
-+# that follow. The default is UTF-8 which is also the encoding used for all 
-+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
-+# iconv built into libc) for the transcoding. See 
-+# http://www.gnu.org/software/libiconv for the list of possible encodings.
-+
-+DOXYFILE_ENCODING      = UTF-8
-+
-+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-+# by quotes) that should identify the project.
-+
-+PROJECT_NAME           = libiscsi
-+
-+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-+# This could be handy for archiving the generated documentation or 
-+# if some version control system is used.
-+
-+PROJECT_NUMBER         = 
-+
-+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-+# base path where the generated documentation will be put. 
-+# If a relative path is entered, it will be relative to the location 
-+# where doxygen was started. If left blank the current directory will be used.
-+
-+OUTPUT_DIRECTORY       = 
-+
-+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-+# 4096 sub-directories (in 2 levels) under the output directory of each output 
-+# format and will distribute the generated files over these directories. 
-+# Enabling this option can be useful when feeding doxygen a huge amount of 
-+# source files, where putting all generated files in the same directory would 
-+# otherwise cause performance problems for the file system.
-+
-+CREATE_SUBDIRS         = NO
-+
-+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-+# documentation generated by doxygen is written. Doxygen will use this 
-+# information to generate all constant output in the proper language. 
-+# The default language is English, other supported languages are: 
-+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
-+# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, 
-+# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), 
-+# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, 
-+# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, 
-+# Spanish, Swedish, and Ukrainian.
-+
-+OUTPUT_LANGUAGE        = English
-+
-+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-+# include brief member descriptions after the members that are listed in 
-+# the file and class documentation (similar to JavaDoc). 
-+# Set to NO to disable this.
-+
-+BRIEF_MEMBER_DESC      = YES
-+
-+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-+# the brief description of a member or function before the detailed description. 
-+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-+# brief descriptions will be completely suppressed.
-+
-+REPEAT_BRIEF           = NO
-+
-+# This tag implements a quasi-intelligent brief description abbreviator 
-+# that is used to form the text in various listings. Each string 
-+# in this list, if found as the leading text of the brief description, will be 
-+# stripped from the text and the result after processing the whole list, is 
-+# used as the annotated text. Otherwise, the brief description is used as-is. 
-+# If left blank, the following values are used ("$name" is automatically 
-+# replaced with the name of the entity): "The $name class" "The $name widget" 
-+# "The $name file" "is" "provides" "specifies" "contains" 
-+# "represents" "a" "an" "the"
-+
-+ABBREVIATE_BRIEF       = 
-+
-+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-+# Doxygen will generate a detailed section even if there is only a brief 
-+# description.
-+
-+ALWAYS_DETAILED_SEC    = YES
-+
-+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-+# inherited members of a class in the documentation of that class as if those 
-+# members were ordinary class members. Constructors, destructors and assignment 
-+# operators of the base classes will not be shown.
-+
-+INLINE_INHERITED_MEMB  = NO
-+
-+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-+# path before files name in the file list and in the header files. If set 
-+# to NO the shortest path that makes the file name unique will be used.
-+
-+FULL_PATH_NAMES        = YES
-+
-+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-+# can be used to strip a user-defined part of the path. Stripping is 
-+# only done if one of the specified strings matches the left-hand part of 
-+# the path. The tag can be used to show relative paths in the file list. 
-+# If left blank the directory from which doxygen is run is used as the 
-+# path to strip.
-+
-+STRIP_FROM_PATH        = 
-+
-+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-+# the path mentioned in the documentation of a class, which tells 
-+# the reader which header file to include in order to use a class. 
-+# If left blank only the name of the header file containing the class 
-+# definition is used. Otherwise one should specify the include paths that 
-+# are normally passed to the compiler using the -I flag.
-+
-+STRIP_FROM_INC_PATH    = 
-+
-+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-+# (but less readable) file names. This can be useful is your file systems 
-+# doesn't support long names like on DOS, Mac, or CD-ROM.
-+
-+SHORT_NAMES            = NO
-+
-+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-+# will interpret the first line (until the first dot) of a JavaDoc-style 
-+# comment as the brief description. If set to NO, the JavaDoc 
-+# comments will behave just like regular Qt-style comments 
-+# (thus requiring an explicit @brief command for a brief description.)
-+
-+JAVADOC_AUTOBRIEF      = NO
-+
-+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
-+# interpret the first line (until the first dot) of a Qt-style 
-+# comment as the brief description. If set to NO, the comments 
-+# will behave just like regular Qt-style comments (thus requiring 
-+# an explicit \brief command for a brief description.)
-+
-+QT_AUTOBRIEF           = NO
-+
-+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-+# comments) as a brief description. This used to be the default behaviour. 
-+# The new default is to treat a multi-line C++ comment block as a detailed 
-+# description. Set this tag to YES if you prefer the old behaviour instead.
-+
-+MULTILINE_CPP_IS_BRIEF = NO
-+
-+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-+# member inherits the documentation from any documented member that it 
-+# re-implements.
-+
-+INHERIT_DOCS           = YES
-+
-+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-+# a new page for each member. If set to NO, the documentation of a member will 
-+# be part of the file/class/namespace that contains it.
-+
-+SEPARATE_MEMBER_PAGES  = NO
-+
-+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-+# Doxygen uses this value to replace tabs by spaces in code fragments.
-+
-+TAB_SIZE               = 8
-+
-+# This tag can be used to specify a number of aliases that acts 
-+# as commands in the documentation. An alias has the form "name=value". 
-+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-+# put the command \sideeffect (or @sideeffect) in the documentation, which 
-+# will result in a user-defined paragraph with heading "Side Effects:". 
-+# You can put \n's in the value part of an alias to insert newlines.
-+
-+ALIASES                = 
-+
-+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-+# sources only. Doxygen will then generate output that is more tailored for C. 
-+# For instance, some of the names that are used will be different. The list 
-+# of all members will be omitted, etc.
-+
-+OPTIMIZE_OUTPUT_FOR_C  = YES
-+
-+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-+# sources only. Doxygen will then generate output that is more tailored for 
-+# Java. For instance, namespaces will be presented as packages, qualified 
-+# scopes will look different, etc.
-+
-+OPTIMIZE_OUTPUT_JAVA   = NO
-+
-+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
-+# sources only. Doxygen will then generate output that is more tailored for 
-+# Fortran.
-+
-+OPTIMIZE_FOR_FORTRAN   = NO
-+
-+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
-+# sources. Doxygen will then generate output that is tailored for 
-+# VHDL.
-+
-+OPTIMIZE_OUTPUT_VHDL   = NO
-+
-+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
-+# to include (a tag file for) the STL sources as input, then you should 
-+# set this tag to YES in order to let doxygen match functions declarations and 
-+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-+# func(std::string) {}). This also make the inheritance and collaboration 
-+# diagrams that involve STL classes more complete and accurate.
-+
-+BUILTIN_STL_SUPPORT    = NO
-+
-+# If you use Microsoft's C++/CLI language, you should set this option to YES to
-+# enable parsing support.
-+
-+CPP_CLI_SUPPORT        = NO
-+
-+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
-+# Doxygen will parse them like normal C++ but will assume all classes use public 
-+# instead of private inheritance when no explicit protection keyword is present.
-+
-+SIP_SUPPORT            = NO
-+
-+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
-+# and setter methods for a property. Setting this option to YES (the default) 
-+# will make doxygen to replace the get and set methods by a property in the 
-+# documentation. This will only work if the methods are indeed getting or 
-+# setting a simple type. If this is not the case, or you want to show the 
-+# methods anyway, you should set this option to NO.
-+
-+IDL_PROPERTY_SUPPORT   = YES
-+
-+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-+# tag is set to YES, then doxygen will reuse the documentation of the first 
-+# member in the group (if any) for the other members of the group. By default 
-+# all members of a group must be documented explicitly.
-+
-+DISTRIBUTE_GROUP_DOC   = NO
-+
-+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-+# the same type (for instance a group of public functions) to be put as a 
-+# subgroup of that type (e.g. under the Public Functions section). Set it to 
-+# NO to prevent subgrouping. Alternatively, this can be done per class using 
-+# the \nosubgrouping command.
-+
-+SUBGROUPING            = YES
-+
-+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
-+# is documented as struct, union, or enum with the name of the typedef. So 
-+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
-+# with name TypeT. When disabled the typedef will appear as a member of a file, 
-+# namespace, or class. And the struct will be named TypeS. This can typically 
-+# be useful for C code in case the coding convention dictates that all compound 
-+# types are typedef'ed and only the typedef is referenced, never the tag name.
-+
-+TYPEDEF_HIDES_STRUCT   = NO
-+
-+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
-+# determine which symbols to keep in memory and which to flush to disk.
-+# When the cache is full, less often used symbols will be written to disk.
-+# For small to medium size projects (<1000 input files) the default value is 
-+# probably good enough. For larger projects a too small cache size can cause 
-+# doxygen to be busy swapping symbols to and from disk most of the time 
-+# causing a significant performance penality. 
-+# If the system has enough physical memory increasing the cache will improve the 
-+# performance by keeping more symbols in memory. Note that the value works on 
-+# a logarithmic scale so increasing the size by one will rougly double the 
-+# memory usage. The cache size is given by this formula: 
-+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
-+# corresponding to a cache size of 2^16 = 65536 symbols
-+
-+SYMBOL_CACHE_SIZE      = 0
-+
-+#---------------------------------------------------------------------------
-+# Build related configuration options
-+#---------------------------------------------------------------------------
-+
-+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-+# documentation are documented, even if no documentation was available. 
-+# Private class members and static file members will be hidden unless 
-+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-+
-+EXTRACT_ALL            = YES
-+
-+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-+# will be included in the documentation.
-+
-+EXTRACT_PRIVATE        = NO
-+
-+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-+# will be included in the documentation.
-+
-+EXTRACT_STATIC         = NO
-+
-+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-+# defined locally in source files will be included in the documentation. 
-+# If set to NO only classes defined in header files are included.
-+
-+EXTRACT_LOCAL_CLASSES  = YES
-+
-+# This flag is only useful for Objective-C code. When set to YES local 
-+# methods, which are defined in the implementation section but not in 
-+# the interface are included in the documentation. 
-+# If set to NO (the default) only methods in the interface are included.
-+
-+EXTRACT_LOCAL_METHODS  = NO
-+
-+# If this flag is set to YES, the members of anonymous namespaces will be 
-+# extracted and appear in the documentation as a namespace called 
-+# 'anonymous_namespace{file}', where file will be replaced with the base 
-+# name of the file that contains the anonymous namespace. By default 
-+# anonymous namespace are hidden.
-+
-+EXTRACT_ANON_NSPACES   = NO
-+
-+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-+# undocumented members of documented classes, files or namespaces. 
-+# If set to NO (the default) these members will be included in the 
-+# various overviews, but no documentation section is generated. 
-+# This option has no effect if EXTRACT_ALL is enabled.
-+
-+HIDE_UNDOC_MEMBERS     = NO
-+
-+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-+# undocumented classes that are normally visible in the class hierarchy. 
-+# If set to NO (the default) these classes will be included in the various 
-+# overviews. This option has no effect if EXTRACT_ALL is enabled.
-+
-+HIDE_UNDOC_CLASSES     = NO
-+
-+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-+# friend (class|struct|union) declarations. 
-+# If set to NO (the default) these declarations will be included in the 
-+# documentation.
-+
-+HIDE_FRIEND_COMPOUNDS  = NO
-+
-+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-+# documentation blocks found inside the body of a function. 
-+# If set to NO (the default) these blocks will be appended to the 
-+# function's detailed documentation block.
-+
-+HIDE_IN_BODY_DOCS      = NO
-+
-+# The INTERNAL_DOCS tag determines if documentation 
-+# that is typed after a \internal command is included. If the tag is set 
-+# to NO (the default) then the documentation will be excluded. 
-+# Set it to YES to include the internal documentation.
-+
-+INTERNAL_DOCS          = NO
-+
-+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-+# file names in lower-case letters. If set to YES upper-case letters are also 
-+# allowed. This is useful if you have classes or files whose names only differ 
-+# in case and if your file system supports case sensitive file names. Windows 
-+# and Mac users are advised to set this option to NO.
-+
-+CASE_SENSE_NAMES       = YES
-+
-+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-+# will show members with their full class and namespace scopes in the 
-+# documentation. If set to YES the scope will be hidden.
-+
-+HIDE_SCOPE_NAMES       = NO
-+
-+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-+# will put a list of the files that are included by a file in the documentation 
-+# of that file.
-+
-+SHOW_INCLUDE_FILES     = YES
-+
-+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-+# is inserted in the documentation for inline members.
-+
-+INLINE_INFO            = YES
-+
-+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-+# will sort the (detailed) documentation of file and class members 
-+# alphabetically by member name. If set to NO the members will appear in 
-+# declaration order.
-+
-+SORT_MEMBER_DOCS       = YES
-+
-+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-+# brief documentation of file, namespace and class members alphabetically 
-+# by member name. If set to NO (the default) the members will appear in 
-+# declaration order.
-+
-+SORT_BRIEF_DOCS        = NO
-+
-+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
-+# hierarchy of group names into alphabetical order. If set to NO (the default) 
-+# the group names will appear in their defined order.
-+
-+SORT_GROUP_NAMES       = NO
-+
-+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-+# sorted by fully-qualified names, including namespaces. If set to 
-+# NO (the default), the class list will be sorted only by class name, 
-+# not including the namespace part. 
-+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-+# Note: This option applies only to the class list, not to the 
-+# alphabetical list.
-+
-+SORT_BY_SCOPE_NAME     = NO
-+
-+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-+# disable (NO) the todo list. This list is created by putting \todo 
-+# commands in the documentation.
-+
-+GENERATE_TODOLIST      = YES
-+
-+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-+# disable (NO) the test list. This list is created by putting \test 
-+# commands in the documentation.
-+
-+GENERATE_TESTLIST      = YES
-+
-+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-+# disable (NO) the bug list. This list is created by putting \bug 
-+# commands in the documentation.
-+
-+GENERATE_BUGLIST       = YES
-+
-+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-+# disable (NO) the deprecated list. This list is created by putting 
-+# \deprecated commands in the documentation.
-+
-+GENERATE_DEPRECATEDLIST= YES
-+
-+# The ENABLED_SECTIONS tag can be used to enable conditional 
-+# documentation sections, marked by \if sectionname ... \endif.
-+
-+ENABLED_SECTIONS       = 
-+
-+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-+# the initial value of a variable or define consists of for it to appear in 
-+# the documentation. If the initializer consists of more lines than specified 
-+# here it will be hidden. Use a value of 0 to hide initializers completely. 
-+# The appearance of the initializer of individual variables and defines in the 
-+# documentation can be controlled using \showinitializer or \hideinitializer 
-+# command in the documentation regardless of this setting.
-+
-+MAX_INITIALIZER_LINES  = 30
-+
-+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-+# at the bottom of the documentation of classes and structs. If set to YES the 
-+# list will mention the files that were used to generate the documentation.
-+
-+SHOW_USED_FILES        = YES
-+
-+# If the sources in your project are distributed over multiple directories 
-+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-+# in the documentation. The default is NO.
-+
-+SHOW_DIRECTORIES       = NO
-+
-+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
-+# This will remove the Files entry from the Quick Index and from the 
-+# Folder Tree View (if specified). The default is YES.
-+
-+SHOW_FILES             = YES
-+
-+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
-+# Namespaces page.  This will remove the Namespaces entry from the Quick Index
-+# and from the Folder Tree View (if specified). The default is YES.
-+
-+SHOW_NAMESPACES        = YES
-+
-+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-+# doxygen should invoke to get the current version for each file (typically from 
-+# the version control system). Doxygen will invoke the program by executing (via 
-+# popen()) the command <command> <input-file>, where <command> is the value of 
-+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-+# provided by doxygen. Whatever the program writes to standard output 
-+# is used as the file version. See the manual for examples.
-+
-+FILE_VERSION_FILTER    = 
-+
-+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by 
-+# doxygen. The layout file controls the global structure of the generated output files 
-+# in an output format independent way. The create the layout file that represents 
-+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a 
-+# file name after the option, if omitted DoxygenLayout.xml will be used as the name 
-+# of the layout file.
-+
-+LAYOUT_FILE            = 
-+
-+#---------------------------------------------------------------------------
-+# configuration options related to warning and progress messages
-+#---------------------------------------------------------------------------
-+
-+# The QUIET tag can be used to turn on/off the messages that are generated 
-+# by doxygen. Possible values are YES and NO. If left blank NO is used.
-+
-+QUIET                  = YES
-+
-+# The WARNINGS tag can be used to turn on/off the warning messages that are 
-+# generated by doxygen. Possible values are YES and NO. If left blank 
-+# NO is used.
-+
-+WARNINGS               = YES
-+
-+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-+# automatically be disabled.
-+
-+WARN_IF_UNDOCUMENTED   = YES
-+
-+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-+# potential errors in the documentation, such as not documenting some 
-+# parameters in a documented function, or documenting parameters that 
-+# don't exist or using markup commands wrongly.
-+
-+WARN_IF_DOC_ERROR      = YES
-+
-+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
-+# functions that are documented, but have no documentation for their parameters 
-+# or return value. If set to NO (the default) doxygen will only warn about 
-+# wrong or incomplete parameter documentation, but not about the absence of 
-+# documentation.
-+
-+WARN_NO_PARAMDOC       = NO
-+
-+# The WARN_FORMAT tag determines the format of the warning messages that 
-+# doxygen can produce. The string should contain the $file, $line, and $text 
-+# tags, which will be replaced by the file and line number from which the 
-+# warning originated and the warning text. Optionally the format may contain 
-+# $version, which will be replaced by the version of the file (if it could 
-+# be obtained via FILE_VERSION_FILTER)
-+
-+WARN_FORMAT            = "$file:$line: $text"
-+
-+# The WARN_LOGFILE tag can be used to specify a file to which warning 
-+# and error messages should be written. If left blank the output is written 
-+# to stderr.
-+
-+WARN_LOGFILE           = 
-+
-+#---------------------------------------------------------------------------
-+# configuration options related to the input files
-+#---------------------------------------------------------------------------
-+
-+# The INPUT tag can be used to specify the files and/or directories that contain 
-+# documented source files. You may enter file names like "myfile.cpp" or 
-+# directories like "/usr/src/myproject". Separate the files or directories 
-+# with spaces.
-+
-+INPUT                  = 
-+
-+# This tag can be used to specify the character encoding of the source files 
-+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
-+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
-+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
-+# the list of possible encodings.
-+
-+INPUT_ENCODING         = UTF-8
-+
-+# If the value of the INPUT tag contains directories, you can use the 
-+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-+# and *.h) to filter out the source-files in the directories. If left 
-+# blank the following patterns are tested: 
-+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
-+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
-+
-+FILE_PATTERNS          = 
-+
-+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-+# should be searched for input files as well. Possible values are YES and NO. 
-+# If left blank NO is used.
-+
-+RECURSIVE              = NO
-+
-+# The EXCLUDE tag can be used to specify files and/or directories that should 
-+# excluded from the INPUT source files. This way you can easily exclude a 
-+# subdirectory from a directory tree whose root is specified with the INPUT tag.
-+
-+EXCLUDE                = 
-+
-+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
-+# directories that are symbolic links (a Unix filesystem feature) are excluded 
-+# from the input.
-+
-+EXCLUDE_SYMLINKS       = NO
-+
-+# If the value of the INPUT tag contains directories, you can use the 
-+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-+# certain files from those directories. Note that the wildcards are matched 
-+# against the file with absolute path, so to exclude all test directories 
-+# for example use the pattern */test/*
-+
-+EXCLUDE_PATTERNS       = 
-+
-+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
-+# (namespaces, classes, functions, etc.) that should be excluded from the 
-+# output. The symbol name can be a fully qualified name, a word, or if the 
-+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
-+# AClass::ANamespace, ANamespace::*Test
-+
-+EXCLUDE_SYMBOLS        = 
-+
-+# The EXAMPLE_PATH tag can be used to specify one or more files or 
-+# directories that contain example code fragments that are included (see 
-+# the \include command).
-+
-+EXAMPLE_PATH           = 
-+
-+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-+# and *.h) to filter out the source-files in the directories. If left 
-+# blank all files are included.
-+
-+EXAMPLE_PATTERNS       = 
-+
-+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-+# searched for input files to be used with the \include or \dontinclude 
-+# commands irrespective of the value of the RECURSIVE tag. 
-+# Possible values are YES and NO. If left blank NO is used.
-+
-+EXAMPLE_RECURSIVE      = NO
-+
-+# The IMAGE_PATH tag can be used to specify one or more files or 
-+# directories that contain image that are included in the documentation (see 
-+# the \image command).
-+
-+IMAGE_PATH             = 
-+
-+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-+# invoke to filter for each input file. Doxygen will invoke the filter program 
-+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-+# input file. Doxygen will then use the output that the filter program writes 
-+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-+# ignored.
-+
-+INPUT_FILTER           = 
-+
-+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-+# basis.  Doxygen will compare the file name with each pattern and apply the 
-+# filter if there is a match.  The filters are a list of the form: 
-+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
-+# is applied to all files.
-+
-+FILTER_PATTERNS        = 
-+
-+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-+# INPUT_FILTER) will be used to filter the input files when producing source 
-+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-+
-+FILTER_SOURCE_FILES    = NO
-+
-+#---------------------------------------------------------------------------
-+# configuration options related to source browsing
-+#---------------------------------------------------------------------------
-+
-+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-+# be generated. Documented entities will be cross-referenced with these sources. 
-+# Note: To get rid of all source code in the generated output, make sure also 
-+# VERBATIM_HEADERS is set to NO.
-+
-+SOURCE_BROWSER         = NO
-+
-+# Setting the INLINE_SOURCES tag to YES will include the body 
-+# of functions and classes directly in the documentation.
-+
-+INLINE_SOURCES         = NO
-+
-+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-+# doxygen to hide any special comment blocks from generated source code 
-+# fragments. Normal C and C++ comments will always remain visible.
-+
-+STRIP_CODE_COMMENTS    = YES
-+
-+# If the REFERENCED_BY_RELATION tag is set to YES 
-+# then for each documented function all documented 
-+# functions referencing it will be listed.
-+
-+REFERENCED_BY_RELATION = NO
-+
-+# If the REFERENCES_RELATION tag is set to YES 
-+# then for each documented function all documented entities 
-+# called/used by that function will be listed.
-+
-+REFERENCES_RELATION    = NO
-+
-+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-+# link to the source code.  Otherwise they will link to the documentstion.
-+
-+REFERENCES_LINK_SOURCE = YES
-+
-+# If the USE_HTAGS tag is set to YES then the references to source code 
-+# will point to the HTML generated by the htags(1) tool instead of doxygen 
-+# built-in source browser. The htags tool is part of GNU's global source 
-+# tagging system (see http://www.gnu.org/software/global/global.html). You 
-+# will need version 4.8.6 or higher.
-+
-+USE_HTAGS              = NO
-+
-+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-+# will generate a verbatim copy of the header file for each class for 
-+# which an include is specified. Set to NO to disable this.
-+
-+VERBATIM_HEADERS       = YES
-+
-+#---------------------------------------------------------------------------
-+# configuration options related to the alphabetical class index
-+#---------------------------------------------------------------------------
-+
-+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-+# of all compounds will be generated. Enable this if the project 
-+# contains a lot of classes, structs, unions or interfaces.
-+
-+ALPHABETICAL_INDEX     = NO
-+
-+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-+# in which this list will be split (can be a number in the range [1..20])
-+
-+COLS_IN_ALPHA_INDEX    = 5
-+
-+# In case all classes in a project start with a common prefix, all 
-+# classes will be put under the same header in the alphabetical index. 
-+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-+# should be ignored while generating the index headers.
-+
-+IGNORE_PREFIX          = 
-+
-+#---------------------------------------------------------------------------
-+# configuration options related to the HTML output
-+#---------------------------------------------------------------------------
-+
-+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-+# generate HTML output.
-+
-+GENERATE_HTML          = YES
-+
-+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-+# put in front of it. If left blank `html' will be used as the default path.
-+
-+HTML_OUTPUT            = html
-+
-+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-+# doxygen will generate files with .html extension.
-+
-+HTML_FILE_EXTENSION    = .html
-+
-+# The HTML_HEADER tag can be used to specify a personal HTML header for 
-+# each generated HTML page. If it is left blank doxygen will generate a 
-+# standard header.
-+
-+HTML_HEADER            = 
-+
-+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-+# each generated HTML page. If it is left blank doxygen will generate a 
-+# standard footer.
-+
-+HTML_FOOTER            = 
-+
-+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-+# style sheet that is used by each HTML page. It can be used to 
-+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-+# will generate a default style sheet. Note that doxygen will try to copy 
-+# the style sheet file to the HTML output directory, so don't put your own 
-+# stylesheet in the HTML output directory as well, or it will be erased!
-+
-+HTML_STYLESHEET        = 
-+
-+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-+# files or namespaces will be aligned in HTML using tables. If set to 
-+# NO a bullet list will be used.
-+
-+HTML_ALIGN_MEMBERS     = YES
-+
-+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
-+# documentation will contain sections that can be hidden and shown after the 
-+# page has loaded. For this to work a browser that supports 
-+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
-+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
-+
-+HTML_DYNAMIC_SECTIONS  = NO
-+
-+# If the GENERATE_DOCSET tag is set to YES, additional index files 
-+# will be generated that can be used as input for Apple's Xcode 3 
-+# integrated development environment, introduced with OSX 10.5 (Leopard). 
-+# To create a documentation set, doxygen will generate a Makefile in the 
-+# HTML output directory. Running make will produce the docset in that 
-+# directory and running "make install" will install the docset in 
-+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
-+# it at startup. 
-+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
-+
-+GENERATE_DOCSET        = NO
-+
-+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
-+# feed. A documentation feed provides an umbrella under which multiple 
-+# documentation sets from a single provider (such as a company or product suite) 
-+# can be grouped.
-+
-+DOCSET_FEEDNAME        = "Doxygen generated docs"
-+
-+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
-+# should uniquely identify the documentation set bundle. This should be a 
-+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
-+# will append .docset to the name.
-+
-+DOCSET_BUNDLE_ID       = org.doxygen.Project
-+
-+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-+# will be generated that can be used as input for tools like the 
-+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
-+# of the generated HTML documentation.
-+
-+GENERATE_HTMLHELP      = NO
-+
-+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-+# be used to specify the file name of the resulting .chm file. You 
-+# can add a path in front of the file if the result should not be 
-+# written to the html output directory.
-+
-+CHM_FILE               = 
-+
-+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-+# be used to specify the location (absolute path including file name) of 
-+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-+# the HTML help compiler on the generated index.hhp.
-+
-+HHC_LOCATION           = 
-+
-+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-+# controls if a separate .chi index file is generated (YES) or that 
-+# it should be included in the master .chm file (NO).
-+
-+GENERATE_CHI           = NO
-+
-+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
-+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
-+# content.
-+
-+CHM_INDEX_ENCODING     = 
-+
-+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-+# controls whether a binary table of contents is generated (YES) or a 
-+# normal table of contents (NO) in the .chm file.
-+
-+BINARY_TOC             = NO
-+
-+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-+# to the contents of the HTML help documentation and to the tree view.
-+
-+TOC_EXPAND             = NO
-+
-+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER 
-+# are set, an additional index file will be generated that can be used as input for 
-+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated 
-+# HTML documentation.
-+
-+GENERATE_QHP           = NO
-+
-+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
-+# be used to specify the file name of the resulting .qch file. 
-+# The path specified is relative to the HTML output folder.
-+
-+QCH_FILE               = 
-+
-+# The QHP_NAMESPACE tag specifies the namespace to use when generating 
-+# Qt Help Project output. For more information please see 
-+# <a href="http://doc.trolltech.com/qthelpproject.html#namespace">Qt Help Project / Namespace</a>.
-+
-+QHP_NAMESPACE          = org.doxygen.Project
-+
-+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
-+# Qt Help Project output. For more information please see 
-+# <a href="http://doc.trolltech.com/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
-+
-+QHP_VIRTUAL_FOLDER     = doc
-+
-+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
-+# be used to specify the location of Qt's qhelpgenerator. 
-+# If non-empty doxygen will try to run qhelpgenerator on the generated 
-+# .qhp file .
-+
-+QHG_LOCATION           = 
-+
-+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-+# top of each HTML page. The value NO (the default) enables the index and 
-+# the value YES disables it.
-+
-+DISABLE_INDEX          = NO
-+
-+# This tag can be used to set the number of enum values (range [1..20]) 
-+# that doxygen will group on one line in the generated HTML documentation.
-+
-+ENUM_VALUES_PER_LINE   = 4
-+
-+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-+# structure should be generated to display hierarchical information.
-+# If the tag value is set to FRAME, a side panel will be generated
-+# containing a tree-like index structure (just like the one that 
-+# is generated for HTML Help). For this to work a browser that supports 
-+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-+# probably better off using the HTML help feature. Other possible values 
-+# for this tag are: HIERARCHIES, which will generate the Groups, Directories,
-+# and Class Hierarchy pages using a tree view instead of an ordered list;
-+# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which
-+# disables this behavior completely. For backwards compatibility with previous
-+# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE
-+# respectively.
-+
-+GENERATE_TREEVIEW      = NONE
-+
-+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-+# used to set the initial width (in pixels) of the frame in which the tree 
-+# is shown.
-+
-+TREEVIEW_WIDTH         = 250
-+
-+# Use this tag to change the font size of Latex formulas included 
-+# as images in the HTML documentation. The default is 10. Note that 
-+# when you change the font size after a successful doxygen run you need 
-+# to manually remove any form_*.png images from the HTML output directory 
-+# to force them to be regenerated.
-+
-+FORMULA_FONTSIZE       = 10
-+
-+#---------------------------------------------------------------------------
-+# configuration options related to the LaTeX output
-+#---------------------------------------------------------------------------
-+
-+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-+# generate Latex output.
-+
-+GENERATE_LATEX         = NO
-+
-+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-+# put in front of it. If left blank `latex' will be used as the default path.
-+
-+LATEX_OUTPUT           = latex
-+
-+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-+# invoked. If left blank `latex' will be used as the default command name.
-+
-+LATEX_CMD_NAME         = latex
-+
-+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-+# generate index for LaTeX. If left blank `makeindex' will be used as the 
-+# default command name.
-+
-+MAKEINDEX_CMD_NAME     = makeindex
-+
-+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-+# LaTeX documents. This may be useful for small projects and may help to 
-+# save some trees in general.
-+
-+COMPACT_LATEX          = NO
-+
-+# The PAPER_TYPE tag can be used to set the paper type that is used 
-+# by the printer. Possible values are: a4, a4wide, letter, legal and 
-+# executive. If left blank a4wide will be used.
-+
-+PAPER_TYPE             = a4wide
-+
-+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-+# packages that should be included in the LaTeX output.
-+
-+EXTRA_PACKAGES         = 
-+
-+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-+# the generated latex document. The header should contain everything until 
-+# the first chapter. If it is left blank doxygen will generate a 
-+# standard header. Notice: only use this tag if you know what you are doing!
-+
-+LATEX_HEADER           = 
-+
-+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-+# contain links (just like the HTML output) instead of page references 
-+# This makes the output suitable for online browsing using a pdf viewer.
-+
-+PDF_HYPERLINKS         = YES
-+
-+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-+# plain latex in the generated Makefile. Set this option to YES to get a 
-+# higher quality PDF documentation.
-+
-+USE_PDFLATEX           = YES
-+
-+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-+# command to the generated LaTeX files. This will instruct LaTeX to keep 
-+# running if errors occur, instead of asking the user for help. 
-+# This option is also used when generating formulas in HTML.
-+
-+LATEX_BATCHMODE        = NO
-+
-+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-+# include the index chapters (such as File Index, Compound Index, etc.) 
-+# in the output.
-+
-+LATEX_HIDE_INDICES     = NO
-+
-+#---------------------------------------------------------------------------
-+# configuration options related to the RTF output
-+#---------------------------------------------------------------------------
-+
-+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-+# The RTF output is optimized for Word 97 and may not look very pretty with 
-+# other RTF readers or editors.
-+
-+GENERATE_RTF           = NO
-+
-+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-+# put in front of it. If left blank `rtf' will be used as the default path.
-+
-+RTF_OUTPUT             = rtf
-+
-+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-+# RTF documents. This may be useful for small projects and may help to 
-+# save some trees in general.
-+
-+COMPACT_RTF            = NO
-+
-+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-+# will contain hyperlink fields. The RTF file will 
-+# contain links (just like the HTML output) instead of page references. 
-+# This makes the output suitable for online browsing using WORD or other 
-+# programs which support those fields. 
-+# Note: wordpad (write) and others do not support links.
-+
-+RTF_HYPERLINKS         = NO
-+
-+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-+# config file, i.e. a series of assignments. You only have to provide 
-+# replacements, missing definitions are set to their default value.
-+
-+RTF_STYLESHEET_FILE    = 
-+
-+# Set optional variables used in the generation of an rtf document. 
-+# Syntax is similar to doxygen's config file.
-+
-+RTF_EXTENSIONS_FILE    = 
-+
-+#---------------------------------------------------------------------------
-+# configuration options related to the man page output
-+#---------------------------------------------------------------------------
-+
-+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-+# generate man pages
-+
-+GENERATE_MAN           = NO
-+
-+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-+# put in front of it. If left blank `man' will be used as the default path.
-+
-+MAN_OUTPUT             = man
-+
-+# The MAN_EXTENSION tag determines the extension that is added to 
-+# the generated man pages (default is the subroutine's section .3)
-+
-+MAN_EXTENSION          = .3
-+
-+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-+# then it will generate one additional man file for each entity 
-+# documented in the real man page(s). These additional files 
-+# only source the real man page, but without them the man command 
-+# would be unable to find the correct page. The default is NO.
-+
-+MAN_LINKS              = NO
-+
-+#---------------------------------------------------------------------------
-+# configuration options related to the XML output
-+#---------------------------------------------------------------------------
-+
-+# If the GENERATE_XML tag is set to YES Doxygen will 
-+# generate an XML file that captures the structure of 
-+# the code including all documentation.
-+
-+GENERATE_XML           = NO
-+
-+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-+# put in front of it. If left blank `xml' will be used as the default path.
-+
-+XML_OUTPUT             = xml
-+
-+# The XML_SCHEMA tag can be used to specify an XML schema, 
-+# which can be used by a validating XML parser to check the 
-+# syntax of the XML files.
-+
-+XML_SCHEMA             = 
-+
-+# The XML_DTD tag can be used to specify an XML DTD, 
-+# which can be used by a validating XML parser to check the 
-+# syntax of the XML files.
-+
-+XML_DTD                = 
-+
-+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-+# dump the program listings (including syntax highlighting 
-+# and cross-referencing information) to the XML output. Note that 
-+# enabling this will significantly increase the size of the XML output.
-+
-+XML_PROGRAMLISTING     = YES
-+
-+#---------------------------------------------------------------------------
-+# configuration options for the AutoGen Definitions output
-+#---------------------------------------------------------------------------
-+
-+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-+# generate an AutoGen Definitions (see autogen.sf.net) file 
-+# that captures the structure of the code including all 
-+# documentation. Note that this feature is still experimental 
-+# and incomplete at the moment.
-+
-+GENERATE_AUTOGEN_DEF   = NO
-+
-+#---------------------------------------------------------------------------
-+# configuration options related to the Perl module output
-+#---------------------------------------------------------------------------
-+
-+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-+# generate a Perl module file that captures the structure of 
-+# the code including all documentation. Note that this 
-+# feature is still experimental and incomplete at the 
-+# moment.
-+
-+GENERATE_PERLMOD       = NO
-+
-+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-+# to generate PDF and DVI output from the Perl module output.
-+
-+PERLMOD_LATEX          = NO
-+
-+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-+# nicely formatted so it can be parsed by a human reader.  This is useful 
-+# if you want to understand what is going on.  On the other hand, if this 
-+# tag is set to NO the size of the Perl module output will be much smaller 
-+# and Perl will parse it just the same.
-+
-+PERLMOD_PRETTY         = YES
-+
-+# The names of the make variables in the generated doxyrules.make file 
-+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-+# This is useful so different doxyrules.make files included by the same 
-+# Makefile don't overwrite each other's variables.
-+
-+PERLMOD_MAKEVAR_PREFIX = 
-+
-+#---------------------------------------------------------------------------
-+# Configuration options related to the preprocessor   
-+#---------------------------------------------------------------------------
-+
-+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-+# evaluate all C-preprocessor directives found in the sources and include 
-+# files.
-+
-+ENABLE_PREPROCESSING   = YES
-+
-+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-+# names in the source code. If set to NO (the default) only conditional 
-+# compilation will be performed. Macro expansion can be done in a controlled 
-+# way by setting EXPAND_ONLY_PREDEF to YES.
-+
-+MACRO_EXPANSION        = NO
-+
-+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-+# then the macro expansion is limited to the macros specified with the 
-+# PREDEFINED and EXPAND_AS_DEFINED tags.
-+
-+EXPAND_ONLY_PREDEF     = NO
-+
-+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-+# in the INCLUDE_PATH (see below) will be search if a #include is found.
-+
-+SEARCH_INCLUDES        = YES
-+
-+# The INCLUDE_PATH tag can be used to specify one or more directories that 
-+# contain include files that are not input files but should be processed by 
-+# the preprocessor.
-+
-+INCLUDE_PATH           = 
-+
-+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-+# patterns (like *.h and *.hpp) to filter out the header-files in the 
-+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-+# be used.
-+
-+INCLUDE_FILE_PATTERNS  = 
-+
-+# The PREDEFINED tag can be used to specify one or more macro names that 
-+# are defined before the preprocessor is started (similar to the -D option of 
-+# gcc). The argument of the tag is a list of macros of the form: name 
-+# or name=definition (no spaces). If the definition and the = are 
-+# omitted =1 is assumed. To prevent a macro definition from being 
-+# undefined via #undef or recursively expanded use the := operator 
-+# instead of the = operator.
-+
-+PREDEFINED             = 
-+
-+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-+# this tag can be used to specify a list of macro names that should be expanded. 
-+# The macro definition that is found in the sources will be used. 
-+# Use the PREDEFINED tag if you want to use a different macro definition.
-+
-+EXPAND_AS_DEFINED      = 
-+
-+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-+# doxygen's preprocessor will remove all function-like macros that are alone 
-+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-+# function macros are typically used for boiler-plate code, and will confuse 
-+# the parser if not removed.
-+
-+SKIP_FUNCTION_MACROS   = YES
-+
-+#---------------------------------------------------------------------------
-+# Configuration::additions related to external references   
-+#---------------------------------------------------------------------------
-+
-+# The TAGFILES option can be used to specify one or more tagfiles. 
-+# Optionally an initial location of the external documentation 
-+# can be added for each tagfile. The format of a tag file without 
-+# this location is as follows: 
-+#   TAGFILES = file1 file2 ... 
-+# Adding location for the tag files is done as follows: 
-+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-+# where "loc1" and "loc2" can be relative or absolute paths or 
-+# URLs. If a location is present for each tag, the installdox tool 
-+# does not have to be run to correct the links.
-+# Note that each tag file must have a unique name
-+# (where the name does NOT include the path)
-+# If a tag file is not located in the directory in which doxygen 
-+# is run, you must also specify the path to the tagfile here.
-+
-+TAGFILES               = 
-+
-+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-+# a tag file that is based on the input files it reads.
-+
-+GENERATE_TAGFILE       = 
-+
-+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-+# in the class index. If set to NO only the inherited external classes 
-+# will be listed.
-+
-+ALLEXTERNALS           = NO
-+
-+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-+# in the modules index. If set to NO, only the current project's groups will 
-+# be listed.
-+
-+EXTERNAL_GROUPS        = YES
-+
-+# The PERL_PATH should be the absolute path and name of the perl script 
-+# interpreter (i.e. the result of `which perl').
-+
-+PERL_PATH              = /usr/bin/perl
-+
-+#---------------------------------------------------------------------------
-+# Configuration options related to the dot tool   
-+#---------------------------------------------------------------------------
-+
-+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-+# this option is superseded by the HAVE_DOT option below. This is only a 
-+# fallback. It is recommended to install and use dot, since it yields more 
-+# powerful graphs.
-+
-+CLASS_DIAGRAMS         = YES
-+
-+# You can define message sequence charts within doxygen comments using the \msc 
-+# command. Doxygen will then run the mscgen tool (see 
-+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
-+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
-+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
-+# default search path.
-+
-+MSCGEN_PATH            = 
-+
-+# If set to YES, the inheritance and collaboration graphs will hide 
-+# inheritance and usage relations if the target is undocumented 
-+# or is not a class.
-+
-+HIDE_UNDOC_RELATIONS   = YES
-+
-+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-+# available from the path. This tool is part of Graphviz, a graph visualization 
-+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-+# have no effect if this option is set to NO (the default)
-+
-+HAVE_DOT               = NO
-+
-+# By default doxygen will write a font called FreeSans.ttf to the output 
-+# directory and reference it in all dot files that doxygen generates. This 
-+# font does not include all possible unicode characters however, so when you need 
-+# these (or just want a differently looking font) you can specify the font name 
-+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
-+# which can be done by putting it in a standard location or by setting the 
-+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
-+# containing the font.
-+
-+DOT_FONTNAME           = FreeSans
-+
-+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
-+# The default size is 10pt.
-+
-+DOT_FONTSIZE           = 10
-+
-+# By default doxygen will tell dot to use the output directory to look for the 
-+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
-+# different font using DOT_FONTNAME you can set the path where dot 
-+# can find it using this tag.
-+
-+DOT_FONTPATH           = 
-+
-+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-+# will generate a graph for each documented class showing the direct and 
-+# indirect inheritance relations. Setting this tag to YES will force the 
-+# the CLASS_DIAGRAMS tag to NO.
-+
-+CLASS_GRAPH            = YES
-+
-+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-+# will generate a graph for each documented class showing the direct and 
-+# indirect implementation dependencies (inheritance, containment, and 
-+# class references variables) of the class with other documented classes.
-+
-+COLLABORATION_GRAPH    = YES
-+
-+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-+# will generate a graph for groups, showing the direct groups dependencies
-+
-+GROUP_GRAPHS           = YES
-+
-+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
-+# Language.
-+
-+UML_LOOK               = NO
-+
-+# If set to YES, the inheritance and collaboration graphs will show the 
-+# relations between templates and their instances.
-+
-+TEMPLATE_RELATIONS     = NO
-+
-+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-+# tags are set to YES then doxygen will generate a graph for each documented 
-+# file showing the direct and indirect include dependencies of the file with 
-+# other documented files.
-+
-+INCLUDE_GRAPH          = YES
-+
-+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-+# documented header file showing the documented files that directly or 
-+# indirectly include this file.
-+
-+INCLUDED_BY_GRAPH      = YES
-+
-+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
-+# doxygen will generate a call dependency graph for every global function 
-+# or class method. Note that enabling this option will significantly increase 
-+# the time of a run. So in most cases it will be better to enable call graphs 
-+# for selected functions only using the \callgraph command.
-+
-+CALL_GRAPH             = NO
-+
-+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
-+# doxygen will generate a caller dependency graph for every global function 
-+# or class method. Note that enabling this option will significantly increase 
-+# the time of a run. So in most cases it will be better to enable caller 
-+# graphs for selected functions only using the \callergraph command.
-+
-+CALLER_GRAPH           = NO
-+
-+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-+# will graphical hierarchy of all classes instead of a textual one.
-+
-+GRAPHICAL_HIERARCHY    = YES
-+
-+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-+# then doxygen will show the dependencies a directory has on other directories 
-+# in a graphical way. The dependency relations are determined by the #include
-+# relations between the files in the directories.
-+
-+DIRECTORY_GRAPH        = YES
-+
-+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-+# generated by dot. Possible values are png, jpg, or gif
-+# If left blank png will be used.
-+
-+DOT_IMAGE_FORMAT       = png
-+
-+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-+# found. If left blank, it is assumed the dot tool can be found in the path.
-+
-+DOT_PATH               = 
-+
-+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-+# contain dot files that are included in the documentation (see the 
-+# \dotfile command).
-+
-+DOTFILE_DIRS           = 
-+
-+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
-+# nodes that will be shown in the graph. If the number of nodes in a graph 
-+# becomes larger than this value, doxygen will truncate the graph, which is 
-+# visualized by representing a node as a red box. Note that doxygen if the 
-+# number of direct children of the root node in a graph is already larger than 
-+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
-+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-+
-+DOT_GRAPH_MAX_NODES    = 50
-+
-+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-+# from the root by following a path via at most 3 edges will be shown. Nodes 
-+# that lay further from the root node will be omitted. Note that setting this 
-+# option to 1 or 2 may greatly reduce the computation time needed for large 
-+# code bases. Also note that the size of a graph can be further restricted by 
-+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-+
-+MAX_DOT_GRAPH_DEPTH    = 0
-+
-+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-+# background. This is disabled by default, because dot on Windows does not 
-+# seem to support this out of the box. Warning: Depending on the platform used, 
-+# enabling this option may lead to badly anti-aliased labels on the edges of 
-+# a graph (i.e. they become hard to read).
-+
-+DOT_TRANSPARENT        = NO
-+
-+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-+# files in one run (i.e. multiple -o and -T options on the command line). This 
-+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-+# support this, this feature is disabled by default.
-+
-+DOT_MULTI_TARGETS      = NO
-+
-+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-+# generate a legend page explaining the meaning of the various boxes and 
-+# arrows in the dot generated graphs.
-+
-+GENERATE_LEGEND        = YES
-+
-+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-+# remove the intermediate dot files that are used to generate 
-+# the various graphs.
-+
-+DOT_CLEANUP            = YES
-+
-+#---------------------------------------------------------------------------
-+# Configuration::additions related to the search engine   
-+#---------------------------------------------------------------------------
-+
-+# The SEARCHENGINE tag specifies whether or not a search engine should be 
-+# used. If set to NO the values of all tags below this one will be ignored.
-+
-+SEARCHENGINE           = NO
-diff --git a/libiscsi/libiscsi.h b/libiscsi/libiscsi.h
-new file mode 100644
-index 0000000..756590e
---- /dev/null
-+++ b/libiscsi/libiscsi.h
-@@ -0,0 +1,344 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#ifndef __LIBISCSI_H
-+#define __LIBISCSI_H
-+
-+#include <netdb.h>
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif /* __cplusplus */
-+
-+#if __GNUC__ >= 4
-+#define PUBLIC __attribute__ ((visibility("default")))
-+#else
-+#define PUBLIC
-+#endif
-+
-+/** \brief Maximum length for iSCSI values.
-+ *
-+ * Maximum length for iSCSI values such as hostnames and parameter values.
-+ */
-+#define LIBISCSI_VALUE_MAXLEN 256
-+
-+/** \brief supported authentication methods
-+ *
-+ * This enum lists all supported authentication methods.
-+ */
-+enum libiscsi_auth_t {
-+    libiscsi_auth_none   /** No authentication */,
-+    libiscsi_auth_chap   /** CHAP authentication */,
-+};
-+
-+/** \brief libiscsi context struct
-+ *
-+ * Note: even though libiscsi uses a context struct, the underlying open-iscsi
-+ * code does not, so libiscsi is not thread safe, not even when using one
-+ * context per thread!
-+ */
-+struct libiscsi_context;
-+
-+/** \brief iSCSI node record
-+ *
-+ * Struct holding data uniquely identifying an iSCSI node.
-+ */
-+struct libiscsi_node {
-+    char name[LIBISCSI_VALUE_MAXLEN]     /** iSCSI iqn for the node. */;
-+    int tpgt                             /** Portal group number. */;
-+    /* Note open-iscsi has some code in place for multiple connections in one
-+       node record and thus multiple address / port combi's, but this does not
-+       get used anywhere, so we keep things simple and assume one connection */
-+    char address[NI_MAXHOST]             /** Portal hostname or IP-address. */;
-+    int port                             /** Portal port number. */;
-+    char iface[LIBISCSI_VALUE_MAXLEN]    /** Interface to connect through. */;
-+};
-+
-+/** \brief libiscsi CHAP authentication information struct
-+ *
-+ * Struct holding all data needed for CHAP login / authentication. Note that
-+ * \e reverse_username may be a 0 length string in which case only forward
-+ * authentication will be done.
-+ */
-+struct libiscsi_chap_auth_info {
-+    char username[LIBISCSI_VALUE_MAXLEN]         /** Username */;
-+    char password[LIBISCSI_VALUE_MAXLEN]         /** Password */;
-+    char reverse_username[LIBISCSI_VALUE_MAXLEN] /** Reverse Username */;
-+    char reverse_password[LIBISCSI_VALUE_MAXLEN] /** Reverse Password */;
-+};
-+
-+/** \brief generic libiscsi authentication information struct
-+ *
-+ * Struct holding authentication information for discovery and login.
-+ */
-+struct libiscsi_auth_info {
-+    enum libiscsi_auth_t method /** Authentication method to use */;
-+    union {
-+        struct libiscsi_chap_auth_info chap /** Chap specific info */;
-+    } /** Union holding method depenend info */;
-+};
-+
-+/** \brief Initalize libiscsi
-+ *
-+ * This function creates a libiscsi context and initalizes it. This context
-+ * is need to use other libiscsi funtions.
-+ *
-+ * \return     A pointer to the created context, or NULL in case of an error.
-+ */
-+PUBLIC struct libiscsi_context *libiscsi_init(void);
-+
-+/** \brief Cleanup libiscsi used resource
-+ *
-+ * This function cleanups any used resources and then destroys the passed
-+ * context. After this the passed in context may no longer be used!
-+ *
-+ * \param context                libiscsi context to operate on.
-+ */
-+PUBLIC void libiscsi_cleanup(struct libiscsi_context *context);
-+
-+/** \brief Discover iSCSI nodes using sendtargets and add them to the node db.
-+ *
-+ * This function connects to the given address and port and then tries to
-+ * discover iSCSI nodes using the sendtargets protocol. Any found nodes are
-+ * added to the local iSCSI node database and are returned in a dynamically
-+ * allocated array.
-+ *
-+ * Note that the (optional) authentication info is for authenticating the
-+ * discovery, and is not for the found nodes! If the connection(s) to the
-+ * node(s) need authentication too, you can set the username / password for
-+ * those (which can be different!) using the libiscsi_node_set_auth() function.
-+ *
-+ * \param context                libiscsi context to operate on.
-+ * \param address                Hostname or IP-address to connect to.
-+ * \param port                   Port to connect to, or 0 for the default port.
-+ * \param auth_info              Authentication information, or NULL.
-+ * \param nr_found             The number of found nodes will be returned
-+ *                               through this pointer if not NULL.
-+ * \param found_nodes            The address of the dynamically allocated array
-+ *                               of found nodes will be returned through this
-+ *                               pointer if not NULL. The caller must free this
-+ *                               array using free().
-+ * \return                       0 on success, otherwise a standard error code
-+ *                               (from errno.h).
-+ */
-+PUBLIC int libiscsi_discover_sendtargets(struct libiscsi_context *context,
-+    const char *address, int port, const struct libiscsi_auth_info *auth_info,
-+    int *nr_found, struct libiscsi_node **found_nodes);
-+
-+/** \brief Read iSCSI node info from firmware and add them to the node db.
-+ *
-+ * This function discovers iSCSI nodes using firmware (ppc or ibft). Any found
-+ * nodes are added to the local iSCSI node database and are returned in a
-+ * dynamically allocated array.
-+ *
-+ * Note that unlike sendtargets discovery, this function will also read
-+ * authentication info and store that in the database too.
-+ *
-+ * Note this function currently is a stub which will always return -EINVAL
-+ * (IOW it is not yet implemented)
-+ *
-+ * \param context                libiscsi context to operate on.
-+ * \param nr_found             The number of found nodes will be returned
-+ *                               through this pointer if not NULL.
-+ * \param found_nodes            The address of the dynamically allocated array
-+ *                               of found nodes will be returned through this
-+ *                               pointer if not NULL. The caller must free this
-+ *                               array using free().
-+ * \return                       0 on success, otherwise a standard error code
-+ *                               (from errno.h).
-+ */
-+PUBLIC int libiscsi_discover_firmware(struct libiscsi_context *context,
-+    int *nr_found, struct libiscsi_node **found_nodes);
-+
-+/** \brief Check validity of the given authentication info.
-+ *
-+ * This function checks the validity of the given authentication info. For 
-+ * example in case of CHAP, if the username and password are not empty.
-+ *
-+ * This function is mainly intended for use by language bindings.
-+ *
-+ * \param context                libiscsi context to operate on.
-+ * \param auth_info              Authentication information to check.
-+ * \return                       0 on success, otherwise EINVAL.
-+ */
-+PUBLIC int libiscsi_verify_auth_info(struct libiscsi_context *context,
-+      const struct libiscsi_auth_info *auth_info);
-+
-+/** \brief Set the authentication info for the given node.
-+ *
-+ * This function sets the authentication information for the node described by
-+ * the given node record. This will overwrite any existing authentication
-+ * information.
-+ *
-+ * This is the way to specify authentication information for nodes found
-+ * through sendtargets discovery.
-+ *
-+ * Note:
-+ * 1) This is a convience wrapper around libiscsi_node_set_parameter(),
-+ *    setting the node.session.auth.* parameters.
-+ * 2) For nodes found through firmware discovery the authentication information
-+ *    has already been set from the firmware.
-+ * 3) \e auth_info may be NULL in which case any existing authinfo will be
-+ *    cleared.
-+ *
-+ * \param context                libiscsi context to operate on.
-+ * \param node                   iSCSI node to set auth information of
-+ * \param auth_info              Authentication information, or NULL.
-+ * \return                       0 on success, otherwise a standard error code
-+ *                               (from errno.h).
-+ */
-+PUBLIC int libiscsi_node_set_auth(struct libiscsi_context *context,
-+    const struct libiscsi_node *node,
-+    const struct libiscsi_auth_info *auth_info);
-+
-+/** \brief Get the authentication info for the given node.
-+ *
-+ * This function gets the authentication information for the node described by
-+ * the given node record.
-+ *
-+ * \param context                libiscsi context to operate on.
-+ * \param node                   iSCSI node to set auth information of
-+ * \param auth_info              Pointer to a libiscsi_auth_info struct where
-+ *                               the retreived information will be stored.
-+ * \return                       0 on success, otherwise a standard error code
-+ *                               (from errno.h).
-+ */
-+PUBLIC int libiscsi_node_get_auth(struct libiscsi_context *context,
-+    const struct libiscsi_node *node,
-+    struct libiscsi_auth_info *auth_info);
-+
-+/** \brief Login to an iSCSI node.
-+ *
-+ * Login to the iSCSI node described by the given node record.
-+ *
-+ * \param context       libiscsi context to operate on.
-+ * \param node          iSCSI node to login to.
-+ * \return              0 on success, otherwise a standard error code
-+ *                      (from errno.h).
-+ */
-+PUBLIC int libiscsi_node_login(struct libiscsi_context *context,
-+    const struct libiscsi_node *node);
-+
-+/** \brief Logout of an iSCSI node.
-+ *
-+ * Logout of the iSCSI node described by the given node record.
-+ *
-+ * \param context       libiscsi context to operate on.
-+ * \param node          iSCSI node to logout from.
-+ * \return              0 on success, otherwise a standard error code
-+ *                      (from errno.h).
-+ */
-+PUBLIC int libiscsi_node_logout(struct libiscsi_context *context,
-+    const struct libiscsi_node *node);
-+
-+/** \brief Set an iSCSI parameter for the given node
-+ *
-+ * Set the given nodes iSCSI parameter named by \e parameter to value \e value.
-+ *
-+ * \param context       libiscsi context to operate on.
-+ * \param node          iSCSI node to change a parameter from.
-+ * \param parameter     Name of the parameter to set.
-+ * \param value         Value to set the parameter too.
-+ * \return              0 on success, otherwise a standard error code
-+ *                      (from errno.h).
-+ */
-+PUBLIC int libiscsi_node_set_parameter(struct libiscsi_context *context,
-+    const struct libiscsi_node *node,
-+    const char *parameter, const char *value);
-+
-+/** \brief Get the value of an iSCSI parameter for the given node
-+ *
-+ * Get the value of the given nodes iSCSI parameter named by \e parameter.
-+ *
-+ * \param context       libiscsi context to operate on.
-+ * \param node          iSCSI node to change a parameter from.
-+ * \param parameter     Name of the parameter to get.
-+ * \param value         The retreived value is stored here, this buffer must be
-+ *                      atleast LIBISCSI_VALUE_MAXLEN bytes large.
-+ * \return              0 on success, otherwise a standard error code
-+ *                      (from errno.h).
-+ */
-+PUBLIC int libiscsi_node_get_parameter(struct libiscsi_context *context,
-+    const struct libiscsi_node *node, const char *parameter, char *value);
-+
-+/** \brief Get human readable string describing the last libiscsi error.
-+ *
-+ * This function can be called to get a human readable error string when a
-+ * libiscsi function has returned an error. This function uses a single buffer
-+ * per context, thus the result is only valid as long as no other libiscsi
-+ * calls are made on the same context after the failing function call.
-+ *
-+ * \param context       libiscsi context to operate on.
-+ *
-+ * \return human readable string describing the last libiscsi error.
-+ */
-+PUBLIC const char *libiscsi_get_error_string(struct libiscsi_context *context);
-+
-+
-+/************************** Utility functions *******************************/
-+
-+/** \brief libiscsi network config struct
-+ *
-+ * libiscsi network config struct.
-+ */
-+struct libiscsi_network_config {
-+    int dhcp                                  /** Using DHCP? (boolean). */;
-+    char iface_name[LIBISCSI_VALUE_MAXLEN]    /** Interface name. */;
-+    char mac_address[LIBISCSI_VALUE_MAXLEN]   /** MAC address. */;
-+    char ip_address[LIBISCSI_VALUE_MAXLEN]    /** IP address. */;
-+    char netmask[LIBISCSI_VALUE_MAXLEN]       /** Netmask. */;
-+    char gateway[LIBISCSI_VALUE_MAXLEN]       /** IP of Default gateway. */;
-+    char primary_dns[LIBISCSI_VALUE_MAXLEN]   /** IP of the Primary DNS. */;
-+    char secondary_dns[LIBISCSI_VALUE_MAXLEN] /** IP of the Secondary DNS. */;
-+};
-+
-+/** \brief Get network configuration information from iscsi firmware
-+ *
-+ * Function can be called to get the network configuration information
-+ * (like dhcp, ip, netmask, default gateway, etc.) from the firmware of a
-+ * network adapter with iscsi boot firmware.
-+ *
-+ * Note that not all fields of the returned struct are necessarilly filled,
-+ * unset fields contain a 0 length string.
-+ *
-+ * \param config        pointer to a libiscsi_network_config struct to fill.
-+ *
-+ * \return              0 on success, ENODEV when no iscsi firmware was found.
-+ */
-+PUBLIC int libiscsi_get_firmware_network_config(
-+    struct libiscsi_network_config *config);
-+
-+/** \brief Get the initiator name (iqn) from the iscsi firmware
-+ *
-+ * Get the initiator name (iqn) from the iscsi firmware.
-+ *
-+ * \param initiatorname The initiator name is stored here, this buffer must be
-+ *                      atleast LIBISCSI_VALUE_MAXLEN bytes large.
-+ * \return              0 on success, ENODEV when no iscsi firmware was found.
-+ */
-+PUBLIC int libiscsi_get_firmware_initiator_name(char *initiatorname);
-+
-+#undef PUBLIC
-+
-+#ifdef __cplusplus
-+}
-+#endif /* __cplusplus */
-+
-+#endif
-diff --git a/libiscsi/pylibiscsi.c b/libiscsi/pylibiscsi.c
-new file mode 100644
-index 0000000..4b09aa7
---- /dev/null
-+++ b/libiscsi/pylibiscsi.c
-@@ -0,0 +1,638 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <Python.h>
-+#include "libiscsi.h"
-+
-+static struct libiscsi_context *context = NULL;
-+
-+/****************************** helpers ***********************************/
-+static int check_string(const char *string)
-+{
-+      if (strlen(string) >= LIBISCSI_VALUE_MAXLEN) {
-+              PyErr_SetString(PyExc_ValueError, "string too long");
-+              return -1;
-+      }
-+      return 0;
-+}
-+
-+/********************** PyIscsiChapAuthInfo ***************************/
-+
-+typedef struct {
-+      PyObject_HEAD
-+
-+      struct libiscsi_auth_info info;
-+} PyIscsiChapAuthInfo;
-+
-+static int PyIscsiChapAuthInfo_init(PyObject *self, PyObject *args,
-+                                  PyObject *kwds)
-+{
-+      int i;
-+      PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self;
-+      char *kwlist[] = {"username", "password", "reverse_username",
-+                              "reverse_password", NULL};
-+      const char *string[4] = { NULL, NULL, NULL, NULL };
-+
-+      if (!PyArg_ParseTupleAndKeywords(args, kwds,
-+                                      "zz|zz:chapAuthInfo.__init__",
-+                                      kwlist, &string[0], &string[1],
-+                                      &string[2], &string[3]))
-+              return -1;
-+
-+      for (i = 0; i < 4; i++)
-+              if (string[i] && check_string(string[i]))
-+                      return -1;
-+
-+      memset (&chap->info, 0, sizeof(chap->info));
-+      chap->info.method = libiscsi_auth_chap;
-+      if (string[0])
-+              strcpy(chap->info.chap.username, string[0]);
-+      if (string[1])
-+              strcpy(chap->info.chap.password, string[1]);
-+      if (string[2])
-+              strcpy(chap->info.chap.reverse_username, string[2]);
-+      if (string[3])
-+              strcpy(chap->info.chap.reverse_password, string[3]);
-+
-+      if (libiscsi_verify_auth_info(context, &chap->info)) {
-+              PyErr_SetString(PyExc_ValueError,
-+                              libiscsi_get_error_string(context));
-+              return -1;
-+      }
-+      return 0;
-+}
-+
-+static PyObject *PyIscsiChapAuthInfo_get(PyObject *self, void *data)
-+{
-+      PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self;
-+      const char *attr = (const char *)data;
-+
-+      if (!strcmp(attr, "username")) {
-+              return PyString_FromString(chap->info.chap.username);
-+      } else if (!strcmp(attr, "password")) {
-+              return PyString_FromString(chap->info.chap.password);
-+      } else if (!strcmp(attr, "reverse_username")) {
-+              return PyString_FromString(chap->info.chap.reverse_username);
-+      } else if (!strcmp(attr, "reverse_password")) {
-+              return PyString_FromString(chap->info.chap.reverse_password);
-+      }
-+      return NULL;
-+}
-+
-+static int PyIscsiChapAuthInfo_set(PyObject *self, PyObject *value, void *data)
-+{
-+      PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self;
-+      const char *attr = (const char *)data;
-+      const char *str;
-+
-+      if (!PyArg_Parse(value, "s", &str) || check_string(str))
-+              return -1;
-+
-+      if (!strcmp(attr, "username")) {
-+              strcpy(chap->info.chap.username, str);
-+      } else if (!strcmp(attr, "password")) {
-+              strcpy(chap->info.chap.password, str);
-+      } else if (!strcmp(attr, "reverse_username")) {
-+              strcpy(chap->info.chap.reverse_username, str);
-+      } else if (!strcmp(attr, "reverse_password")) {
-+              strcpy(chap->info.chap.reverse_password, str);
-+      }
-+
-+      return 0;
-+}
-+
-+static int PyIscsiChapAuthInfo_compare(PyIscsiChapAuthInfo *self,
-+                                     PyIscsiChapAuthInfo *other)
-+{
-+      int r;
-+
-+      r = strcmp(self->info.chap.username, other->info.chap.username);
-+      if (r)
-+              return r;
-+
-+      r = strcmp(self->info.chap.password, other->info.chap.password);
-+      if (r)
-+              return r;
-+
-+      r = strcmp(self->info.chap.reverse_username,
-+                 other->info.chap.reverse_username);
-+      if (r)
-+              return r;
-+
-+      r = strcmp(self->info.chap.reverse_password,
-+                 other->info.chap.reverse_password);
-+      return r;
-+}
-+
-+static PyObject *PyIscsiChapAuthInfo_str(PyObject *self)
-+{
-+      PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self;
-+      char s[1024], reverse[512] = "";
-+
-+      if (chap->info.chap.reverse_username[0])
-+              snprintf(reverse, sizeof(reverse), ", %s:%s",
-+                       chap->info.chap.reverse_username,
-+                       chap->info.chap.reverse_password);
-+
-+      snprintf(s, sizeof(s), "%s:%s%s", chap->info.chap.username,
-+               chap->info.chap.password, reverse);
-+
-+      return PyString_FromString(s);
-+}
-+
-+static struct PyGetSetDef PyIscsiChapAuthInfo_getseters[] = {
-+      {"username", (getter)PyIscsiChapAuthInfo_get,
-+              (setter)PyIscsiChapAuthInfo_set,
-+              "username", "username"},
-+      {"password", (getter)PyIscsiChapAuthInfo_get,
-+              (setter)PyIscsiChapAuthInfo_set,
-+              "password", "password"},
-+      {"reverse_username", (getter)PyIscsiChapAuthInfo_get,
-+              (setter)PyIscsiChapAuthInfo_set,
-+              "reverse_username", "reverse_username"},
-+      {"reverse_password", (getter)PyIscsiChapAuthInfo_get,
-+              (setter)PyIscsiChapAuthInfo_set,
-+              "reverse_password", "reverse_password"},
-+      {NULL}
-+};
-+
-+PyTypeObject PyIscsiChapAuthInfo_Type = {
-+      PyObject_HEAD_INIT(NULL)
-+      .tp_name = "libiscsi.chapAuthInfo",
-+      .tp_basicsize = sizeof (PyIscsiChapAuthInfo),
-+      .tp_getset = PyIscsiChapAuthInfo_getseters,
-+      .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
-+                  Py_TPFLAGS_BASETYPE,
-+      .tp_compare = (cmpfunc)PyIscsiChapAuthInfo_compare,
-+      .tp_init = PyIscsiChapAuthInfo_init,
-+      .tp_str = PyIscsiChapAuthInfo_str,
-+      .tp_new = PyType_GenericNew,
-+      .tp_doc = "iscsi chap authentication information.",
-+};
-+
-+/***************************** PyIscsiNode  ********************************/
-+
-+typedef struct {
-+      PyObject_HEAD
-+
-+      struct libiscsi_node node;
-+} PyIscsiNode;
-+
-+static int PyIscsiNode_init(PyObject *self, PyObject *args, PyObject *kwds)
-+{
-+      PyIscsiNode *node = (PyIscsiNode *)self;
-+      char *kwlist[] = {"name", "tpgt", "address", "port", "iface", NULL};
-+      const char *name = NULL, *address = NULL, *iface = NULL;
-+      int tpgt = -1, port = 3260;
-+
-+      if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|isis:node.__init__",
-+                                       kwlist, &name, &tpgt, &address,
-+                                       &port, &iface))
-+              return -1;
-+      if (address == NULL) {
-+              PyErr_SetString(PyExc_ValueError, "address not set");
-+              return -1;
-+      }
-+      if (check_string(name) || check_string(address) || check_string(iface))
-+              return -1;
-+
-+      strcpy(node->node.name, name);
-+      node->node.tpgt = tpgt;
-+      strcpy(node->node.address, address);
-+      node->node.port = port;
-+      strcpy(node->node.iface, iface);
-+
-+      return 0;
-+}
-+
-+static PyObject *PyIscsiNode_get(PyObject *self, void *data)
-+{
-+      PyIscsiNode *node = (PyIscsiNode *)self;
-+      const char *attr = (const char *)data;
-+
-+      if (!strcmp(attr, "name")) {
-+              return PyString_FromString(node->node.name);
-+      } else if (!strcmp(attr, "tpgt")) {
-+              return PyInt_FromLong(node->node.tpgt);
-+      } else if (!strcmp(attr, "address")) {
-+              return PyString_FromString(node->node.address);
-+      } else if (!strcmp(attr, "port")) {
-+              return PyInt_FromLong(node->node.port);
-+      } else if (!strcmp(attr, "iface")) {
-+              return PyString_FromString(node->node.iface);
-+      }
-+      return NULL;
-+}
-+
-+static int PyIscsiNode_set(PyObject *self, PyObject *value, void *data)
-+{
-+      PyIscsiNode *node = (PyIscsiNode *)self;
-+      const char *attr = (const char *)data;
-+      const char *str;
-+      int i;
-+
-+      if (!strcmp(attr, "name")) {
-+              if (!PyArg_Parse(value, "s", &str) || check_string(str))
-+                      return -1;
-+              strcpy(node->node.name, str);
-+      } else if (!strcmp(attr, "tpgt")) {
-+              if (!PyArg_Parse(value, "i", &i))
-+                      return -1;
-+              node->node.tpgt = i;
-+      } else if (!strcmp(attr, "address")) {
-+              if (!PyArg_Parse(value, "s", &str) || check_string(str))
-+                      return -1;
-+              strcpy(node->node.address, str);
-+      } else if (!strcmp(attr, "port")) {
-+              if (!PyArg_Parse(value, "i", &i))
-+                      return -1;
-+              node->node.port = i;
-+      } else if (!strcmp(attr, "iface")) {
-+              if (!PyArg_Parse(value, "s", &str) || check_string(str))
-+                      return -1;
-+              strcpy(node->node.iface, str);
-+      }
-+
-+      return 0;
-+}
-+
-+static int PyIscsiNode_compare(PyIscsiNode *self, PyIscsiNode *other)
-+{
-+      int res;
-+
-+      res = strcmp(self->node.name, other->node.name);
-+      if (res)
-+              return res;
-+
-+      if (self->node.tpgt < other->node.tpgt)
-+              return -1;
-+      if (self->node.tpgt > other->node.tpgt)
-+              return -1;
-+
-+      res = strcmp(self->node.address, other->node.address);
-+      if (res)
-+              return res;
-+
-+      if (self->node.port < other->node.port)
-+              return -1;
-+      if (self->node.port > other->node.port)
-+              return -1;
-+
-+      res = strcmp(self->node.iface, other->node.iface);
-+      if (res)
-+              return res;
-+
-+      return 0;
-+}
-+
-+static PyObject *PyIscsiNode_str(PyObject *self)
-+{
-+      PyIscsiNode *node = (PyIscsiNode *)self;
-+      char s[1024], tpgt[16] = "";
-+
-+      if (node->node.tpgt != -1)
-+              sprintf(tpgt, ",%d", node->node.tpgt);
-+
-+      snprintf(s, sizeof(s), "%s:%d%s %s", node->node.address,
-+               node->node.port, tpgt, node->node.name);
-+
-+      return PyString_FromString(s);
-+}
-+
-+static PyObject *PyIscsiNode_login(PyObject *self)
-+{
-+      PyIscsiNode *node = (PyIscsiNode *)self;
-+
-+      if (libiscsi_node_login(context, &node->node)) {
-+              PyErr_SetString(PyExc_IOError,
-+                              libiscsi_get_error_string(context));
-+              return NULL;
-+      }
-+      Py_RETURN_NONE;
-+}
-+
-+static PyObject *PyIscsiNode_logout(PyObject *self)
-+{
-+      PyIscsiNode *node = (PyIscsiNode *)self;
-+
-+      if (libiscsi_node_logout(context, &node->node)) {
-+              PyErr_SetString(PyExc_IOError,
-+                              libiscsi_get_error_string(context));
-+              return NULL;
-+      }
-+      Py_RETURN_NONE;
-+}
-+
-+static PyObject *PyIscsiNode_setAuth(PyObject *self, PyObject *args,
-+                                   PyObject *kwds)
-+{
-+      char *kwlist[] = {"authinfo", NULL};
-+      PyIscsiNode *node = (PyIscsiNode *)self;
-+      PyObject *arg;
-+      const struct libiscsi_auth_info *authinfo = NULL;
-+
-+      if (!PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &arg))
-+              return NULL;
-+
-+      if (arg == Py_None) {
-+              authinfo = NULL;
-+      } else if (PyObject_IsInstance(arg, (PyObject *)
-+                                     &PyIscsiChapAuthInfo_Type)) {
-+              PyIscsiChapAuthInfo *pyauthinfo = (PyIscsiChapAuthInfo *)arg;
-+              authinfo = &pyauthinfo->info;
-+      } else {
-+              PyErr_SetString(PyExc_ValueError, "invalid authinfo type");
-+              return NULL;
-+      }
-+
-+      if (libiscsi_node_set_auth(context, &node->node, authinfo)) {
-+              PyErr_SetString(PyExc_IOError,
-+                              libiscsi_get_error_string(context));
-+              return NULL;
-+      }
-+      Py_RETURN_NONE;
-+}
-+
-+static PyObject *PyIscsiNode_getAuth(PyObject *self)
-+{
-+      PyIscsiNode *node = (PyIscsiNode *)self;
-+      PyIscsiChapAuthInfo *pyauthinfo;
-+      struct libiscsi_auth_info authinfo;
-+
-+      if (libiscsi_node_get_auth(context, &node->node, &authinfo)) {
-+              PyErr_SetString(PyExc_IOError,
-+                              libiscsi_get_error_string(context));
-+              return NULL;
-+      }
-+
-+      switch (authinfo.method) {
-+      case libiscsi_auth_chap:
-+              pyauthinfo = PyObject_New(PyIscsiChapAuthInfo,
-+                                        &PyIscsiChapAuthInfo_Type);
-+              if (!pyauthinfo)
-+                      return NULL;
-+
-+              pyauthinfo->info = authinfo;
-+
-+              return (PyObject *)pyauthinfo;
-+
-+      case libiscsi_auth_none:
-+      default:
-+              Py_RETURN_NONE;
-+      }
-+}
-+
-+static PyObject *PyIscsiNode_setParameter(PyObject *self, PyObject *args,
-+                                        PyObject *kwds)
-+{
-+      char *kwlist[] = {"parameter", "value", NULL};
-+      PyIscsiNode *node = (PyIscsiNode *)self;
-+      const char *parameter, *value;
-+
-+      if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss", kwlist,
-+                                       &parameter, &value))
-+              return NULL;
-+      if (check_string(parameter) || check_string(value))
-+              return NULL;
-+
-+      if (libiscsi_node_set_parameter(context, &node->node, parameter,
-+                                      value)) {
-+              PyErr_SetString(PyExc_IOError,
-+                              libiscsi_get_error_string(context));
-+              return NULL;
-+      }
-+      Py_RETURN_NONE;
-+}
-+
-+static PyObject *PyIscsiNode_getParameter(PyObject *self, PyObject *args,
-+                                        PyObject *kwds)
-+{
-+      char *kwlist[] = {"parameter", NULL};
-+      PyIscsiNode *node = (PyIscsiNode *)self;
-+      const char *parameter;
-+      char value[LIBISCSI_VALUE_MAXLEN];
-+
-+      if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &parameter))
-+              return NULL;
-+      if (check_string(parameter))
-+              return NULL;
-+
-+      if (libiscsi_node_get_parameter(context, &node->node, parameter,
-+                                      value)) {
-+              PyErr_SetString(PyExc_IOError,
-+                              libiscsi_get_error_string(context));
-+              return NULL;
-+      }
-+      return Py_BuildValue("s", value);
-+}
-+
-+static struct PyGetSetDef PyIscsiNode_getseters[] = {
-+      {"name", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set,
-+              "name", "name"},
-+      {"tpgt", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set,
-+              "tpgt", "tpgt"},
-+      {"address", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set,
-+              "address", "address"},
-+      {"port", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set,
-+              "port", "port"},
-+      {"iface", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set,
-+              "iface", "iface"},
-+      {NULL}
-+};
-+
-+static struct PyMethodDef  PyIscsiNode_methods[] = {
-+      {"login", (PyCFunction) PyIscsiNode_login, METH_NOARGS,
-+              "Log in to the node"},
-+      {"logout", (PyCFunction) PyIscsiNode_logout, METH_NOARGS,
-+              "Log out of the node"},
-+      {"setAuth", (PyCFunction) PyIscsiNode_setAuth,
-+              METH_VARARGS|METH_KEYWORDS,
-+              "Set authentication information"},
-+      {"getAuth", (PyCFunction) PyIscsiNode_getAuth, METH_NOARGS,
-+              "Get authentication information"},
-+      {"setParameter", (PyCFunction) PyIscsiNode_setParameter,
-+              METH_VARARGS|METH_KEYWORDS,
-+              "Set an iscsi node parameter"},
-+      {"getParameter", (PyCFunction) PyIscsiNode_getParameter,
-+              METH_VARARGS|METH_KEYWORDS,
-+              "Get an iscsi node parameter"},
-+      {NULL}
-+};
-+
-+PyTypeObject PyIscsiNode_Type = {
-+      PyObject_HEAD_INIT(NULL)
-+      .tp_name = "libiscsi.node",
-+      .tp_basicsize = sizeof (PyIscsiNode),
-+      .tp_getset = PyIscsiNode_getseters,
-+      .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
-+                  Py_TPFLAGS_BASETYPE,
-+      .tp_methods = PyIscsiNode_methods,
-+      .tp_compare = (cmpfunc)PyIscsiNode_compare,
-+      .tp_init = PyIscsiNode_init,
-+      .tp_str = PyIscsiNode_str,
-+      .tp_new = PyType_GenericNew,
-+      .tp_doc = "The iscsi node contains iscsi node information.",
-+};
-+
-+/***************************************************************************/
-+
-+static PyObject *pylibiscsi_discover_sendtargets(PyObject *self,
-+                                              PyObject *args, PyObject *kwds)
-+{
-+      char *kwlist[] = {"address", "port", "authinfo", NULL};
-+      const char *address = NULL;
-+      int i, nr_found, port = 3260;
-+      PyObject *authinfo_arg = NULL;
-+      const struct libiscsi_auth_info *authinfo = NULL;
-+      struct libiscsi_node *found_nodes;
-+      PyObject* found_node_list;
-+
-+      if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|iO",
-+                                      kwlist, &address, &port,
-+                                      &authinfo_arg))
-+              return NULL;
-+
-+      if (authinfo_arg) {
-+              if (PyObject_IsInstance(authinfo_arg, (PyObject *)
-+                                             &PyIscsiChapAuthInfo_Type)) {
-+                      PyIscsiChapAuthInfo *pyauthinfo =
-+                              (PyIscsiChapAuthInfo *)authinfo_arg;
-+                      authinfo = &pyauthinfo->info;
-+              } else if (authinfo_arg != Py_None) {
-+                      PyErr_SetString(PyExc_ValueError,
-+                              "invalid authinfo type");
-+                      return NULL;
-+              }
-+      }
-+
-+      if (libiscsi_discover_sendtargets(context, address, port, authinfo,
-+                                        &nr_found, &found_nodes)) {
-+              PyErr_SetString(PyExc_IOError,
-+                              libiscsi_get_error_string(context));
-+              return NULL;
-+      }
-+
-+      if (nr_found == 0)
-+              Py_RETURN_NONE;
-+
-+      found_node_list = PyList_New(nr_found);
-+      if (!found_node_list)
-+              return NULL;
-+
-+      for(i = 0; i < nr_found; i++) {
-+              PyIscsiNode *pynode;
-+              
-+              pynode = PyObject_New(PyIscsiNode, &PyIscsiNode_Type);
-+              if (!pynode) {
-+                      /* This will deref already added nodes for us */
-+                      Py_DECREF(found_node_list);
-+                      return NULL;
-+              }
-+              pynode->node = found_nodes[i];
-+              PyList_SET_ITEM(found_node_list, i, (PyObject *)pynode);
-+      }
-+
-+      return found_node_list; 
-+}
-+
-+static PyObject *pylibiscsi_discover_firmware(PyObject *self)
-+{
-+      int i, nr_found;
-+      struct libiscsi_node *found_nodes;
-+      PyObject* found_node_list;
-+
-+      if (libiscsi_discover_firmware(context, &nr_found, &found_nodes)) {
-+              PyErr_SetString(PyExc_IOError,
-+                              libiscsi_get_error_string(context));
-+              return NULL;
-+      }
-+
-+      if (nr_found == 0)
-+              Py_RETURN_NONE;
-+
-+      found_node_list = PyList_New(nr_found);
-+      if (!found_node_list)
-+              return NULL;
-+
-+      for(i = 0; i < nr_found; i++) {
-+              PyIscsiNode *pynode;
-+              
-+              pynode = PyObject_New(PyIscsiNode, &PyIscsiNode_Type);
-+              if (!pynode) {
-+                      /* This will deref already added nodes for us */
-+                      Py_DECREF(found_node_list);
-+                      return NULL;
-+              }
-+              pynode->node = found_nodes[i];
-+              PyList_SET_ITEM(found_node_list, i, (PyObject *)pynode);
-+      }
-+
-+      return found_node_list; 
-+}
-+
-+static PyObject *pylibiscsi_get_firmware_initiator_name(PyObject *self)
-+{
-+      char initiatorname[LIBISCSI_VALUE_MAXLEN];
-+
-+      if (libiscsi_get_firmware_initiator_name(initiatorname)) {
-+              PyErr_SetString(PyExc_IOError,
-+                              libiscsi_get_error_string(context));
-+              return NULL;
-+      }
-+
-+      return PyString_FromString(initiatorname);
-+}
-+
-+static PyMethodDef pylibiscsi_functions[] = {
-+      {       "discover_sendtargets",
-+              (PyCFunction)pylibiscsi_discover_sendtargets,
-+              METH_VARARGS|METH_KEYWORDS,
-+              "Do sendtargets discovery and return a list of found nodes)"},
-+      {       "discover_firmware",
-+              (PyCFunction)pylibiscsi_discover_firmware, METH_NOARGS,
-+              "Do firmware discovery and return a list of found nodes)"},
-+      {       "get_firmware_initiator_name",
-+              (PyCFunction)pylibiscsi_get_firmware_initiator_name,
-+              METH_NOARGS,
-+              "Get initator name (iqn) from firmware"},
-+      {NULL, NULL}
-+};
-+
-+PyMODINIT_FUNC initlibiscsi(void)
-+{
-+      PyObject *m;
-+
-+      if (!context) /* We may be called more then once */
-+              context = libiscsi_init();
-+      if (!context)
-+              return;
-+
-+      if (PyType_Ready(&PyIscsiChapAuthInfo_Type) < 0)
-+              return;
-+
-+      if (PyType_Ready(&PyIscsiNode_Type) < 0)
-+              return;
-+
-+      m = Py_InitModule("libiscsi", pylibiscsi_functions);
-+      Py_INCREF(&PyIscsiChapAuthInfo_Type);
-+      PyModule_AddObject(m, "chapAuthInfo", (PyObject *) &PyIscsiChapAuthInfo_Type);
-+      Py_INCREF(&PyIscsiNode_Type);
-+      PyModule_AddObject(m, "node", (PyObject *) &PyIscsiNode_Type);
-+}
-diff --git a/libiscsi/setup.py b/libiscsi/setup.py
-new file mode 100644
-index 0000000..bb4329b
---- /dev/null
-+++ b/libiscsi/setup.py
-@@ -0,0 +1,9 @@
-+from distutils.core import setup, Extension
-+
-+module1 = Extension('libiscsimodule',
-+                    sources = ['pylibiscsi.c'],
-+                    libraries = ['iscsi'],
-+                    library_dirs = ['.'])
-+
-+setup (name = 'PyIscsi',version = '1.0',
-+       description = 'libiscsi python bindings', ext_modules = [module1])
-diff --git a/libiscsi/tests/test_discovery_firmware.c b/libiscsi/tests/test_discovery_firmware.c
-new file mode 100644
-index 0000000..76e852a
---- /dev/null
-+++ b/libiscsi/tests/test_discovery_firmware.c
-@@ -0,0 +1,53 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include "libiscsi.h"
-+
-+int main(void)
-+{
-+      struct libiscsi_node *found_nodes;
-+      struct libiscsi_context *context;
-+      int i, found, rc = 0;
-+
-+      context = libiscsi_init();
-+      if (!context) {
-+              fprintf(stderr, "Error initializing libiscsi\n");
-+              return 1;
-+      }
-+
-+      rc = libiscsi_discover_firmware(context, &found, &found_nodes);
-+      if (rc)
-+              fprintf(stderr, "Error discovering: %s\n",
-+                      libiscsi_get_error_string(context));
-+
-+      for (i = 0; i < found; i++) {
-+              fprintf(stdout, "Found node: %s, tpgt: %d, portal: %s:%d\n",
-+                      found_nodes[i].name, found_nodes[i].tpgt,
-+                      found_nodes[i].address, found_nodes[i].port);
-+      }
-+
-+      libiscsi_cleanup(context);
-+      free (found_nodes);
-+
-+      return rc;
-+}
-diff --git a/libiscsi/tests/test_discovery_sendtargets.c b/libiscsi/tests/test_discovery_sendtargets.c
-new file mode 100644
-index 0000000..1a3c12e
---- /dev/null
-+++ b/libiscsi/tests/test_discovery_sendtargets.c
-@@ -0,0 +1,60 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include "libiscsi.h"
-+
-+int main(void)
-+{
-+      struct libiscsi_node *found_nodes;
-+      struct libiscsi_context *context;
-+      struct libiscsi_auth_info auth_info;
-+      int i, found, rc = 0;
-+
-+      context = libiscsi_init();
-+      if (!context) {
-+              fprintf(stderr, "Error initializing libiscsi\n");
-+              return 1;
-+      }
-+
-+      memset(&auth_info, 0, sizeof(auth_info));
-+      auth_info.method = libiscsi_auth_chap;
-+      strcpy(auth_info.chap.username, "joe");
-+      strcpy(auth_info.chap.password, "secret");
-+
-+      rc = libiscsi_discover_sendtargets(context, "127.0.0.1", 3260,
-+                                         &auth_info, &found, &found_nodes);
-+      if (rc)
-+              fprintf(stderr, "Error discovering: %s\n",
-+                      libiscsi_get_error_string(context));
-+
-+      for (i = 0; i < found; i++) {
-+              fprintf(stdout, "Found node: %s, tpgt: %d, portal: %s:%d\n",
-+                      found_nodes[i].name, found_nodes[i].tpgt,
-+                      found_nodes[i].address, found_nodes[i].port);
-+      }
-+
-+      libiscsi_cleanup(context);
-+      free (found_nodes);
-+
-+      return rc;
-+}
-diff --git a/libiscsi/tests/test_get_auth.c b/libiscsi/tests/test_get_auth.c
-new file mode 100644
-index 0000000..5e234da
---- /dev/null
-+++ b/libiscsi/tests/test_get_auth.c
-@@ -0,0 +1,70 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include "libiscsi.h"
-+
-+int main(void)
-+{
-+      struct libiscsi_node node;
-+      struct libiscsi_context *context;
-+      struct libiscsi_auth_info auth_info;
-+      int rc = 0;
-+
-+      snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s",
-+               "iqn.2009-01.com.example:testdisk");
-+      node.tpgt = 1;
-+      snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1");
-+      node.port = 3260;
-+
-+      context = libiscsi_init();
-+      if (!context) {
-+              fprintf(stderr, "Error initializing libiscsi\n");
-+              return 1;
-+      }
-+
-+      rc = libiscsi_node_get_auth(context, &node, &auth_info);
-+      if (rc) {
-+              fprintf(stderr, "Error setting authinfo: %s\n",
-+                      libiscsi_get_error_string(context));
-+              goto leave;
-+      }
-+
-+      switch (auth_info.method) {
-+              case libiscsi_auth_none:
-+                      printf("Method:  \"None\"\n");
-+                      break;
-+              case libiscsi_auth_chap:
-+                      printf("Method:  \"CHAP\"\n");
-+                      printf("User:    \"%s\"\n", auth_info.chap.username);
-+                      printf("Pass:    \"%s\"\n", auth_info.chap.password);
-+                      printf("RevUser: \"%s\"\n",
-+                              auth_info.chap.reverse_username);
-+                      printf("RevPass: \"%s\"\n",
-+                              auth_info.chap.reverse_password);
-+                      break;
-+      }
-+leave:
-+      libiscsi_cleanup(context);
-+
-+      return rc;
-+}
-diff --git a/libiscsi/tests/test_get_initiator_name.c b/libiscsi/tests/test_get_initiator_name.c
-new file mode 100644
-index 0000000..997c053
---- /dev/null
-+++ b/libiscsi/tests/test_get_initiator_name.c
-@@ -0,0 +1,38 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include "libiscsi.h"
-+
-+int main(void)
-+{
-+      char initiatorname[LIBISCSI_VALUE_MAXLEN];
-+
-+      if (libiscsi_get_firmware_initiator_name(initiatorname)) {
-+              fprintf(stderr, "No iscsi boot firmware found\n");
-+              return 1;
-+      }
-+
-+      printf("iqn:\t%s\n", initiatorname);
-+
-+      return 0;
-+}
-diff --git a/libiscsi/tests/test_get_network_config.c b/libiscsi/tests/test_get_network_config.c
-new file mode 100644
-index 0000000..2dedd61
---- /dev/null
-+++ b/libiscsi/tests/test_get_network_config.c
-@@ -0,0 +1,45 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include "libiscsi.h"
-+
-+int main(void)
-+{
-+      struct libiscsi_network_config config;
-+
-+      if (libiscsi_get_firmware_network_config(&config)) {
-+              fprintf(stderr, "No iscsi boot firmware found\n");
-+              return 1;
-+      }
-+
-+      printf("dhcp:\t%d\n", config.dhcp);
-+      printf("iface:\t%s\n", config.iface_name);
-+      printf("mac:\t%s\n", config.mac_address);
-+      printf("ipaddr:\t%s\n", config.ip_address);
-+      printf("mask:\t%s\n", config.netmask);
-+      printf("gate:\t%s\n", config.gateway);
-+      printf("dns1:\t%s\n", config.primary_dns);
-+      printf("dns2:\t%s\n", config.secondary_dns);
-+
-+      return 0;
-+}
-diff --git a/libiscsi/tests/test_login.c b/libiscsi/tests/test_login.c
-new file mode 100644
-index 0000000..3eb70d6
---- /dev/null
-+++ b/libiscsi/tests/test_login.c
-@@ -0,0 +1,52 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include "libiscsi.h"
-+
-+int main(void)
-+{
-+      struct libiscsi_node node;
-+      struct libiscsi_context *context;
-+      int rc = 0;
-+
-+      snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s",
-+               "iqn.2009-01.com.example:testdisk");
-+      node.tpgt = 1;
-+      snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1");
-+      node.port = 3260;
-+
-+      context = libiscsi_init();
-+      if (!context) {
-+              fprintf(stderr, "Error initializing libiscsi\n");
-+              return 1;
-+      }
-+
-+      rc = libiscsi_node_login(context, &node);
-+      if (rc)
-+              fprintf(stderr, "Error logging in: %s\n",
-+                      libiscsi_get_error_string(context));
-+
-+      libiscsi_cleanup(context);
-+
-+      return rc;
-+}
-diff --git a/libiscsi/tests/test_logout.c b/libiscsi/tests/test_logout.c
-new file mode 100644
-index 0000000..b734dca
---- /dev/null
-+++ b/libiscsi/tests/test_logout.c
-@@ -0,0 +1,51 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include "libiscsi.h"
-+
-+int main(void)
-+{
-+      struct libiscsi_node node;
-+      struct libiscsi_context *context;
-+      int rc = 0;
-+
-+      snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s",
-+               "iqn.2009-01.com.example:testdisk");
-+      node.tpgt = 1;
-+      snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1");
-+      node.port = 3260;
-+      
-+      context = libiscsi_init();
-+      if (!context) {
-+              fprintf(stderr, "Error initializing libiscsi\n");
-+              return 1;
-+      }
-+
-+      rc = libiscsi_node_logout(context, &node);
-+      if (rc)
-+              fprintf(stderr, "Error logging out: %s\n",
-+                      libiscsi_get_error_string(context));
-+
-+      libiscsi_cleanup(context);
-+
-+      return rc;
-+}
-diff --git a/libiscsi/tests/test_params.c b/libiscsi/tests/test_params.c
-new file mode 100644
-index 0000000..d3223be
---- /dev/null
-+++ b/libiscsi/tests/test_params.c
-@@ -0,0 +1,103 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <errno.h>
-+#include <string.h>
-+#include "libiscsi.h"
-+
-+int main(void)
-+{
-+      struct libiscsi_node node;
-+      struct libiscsi_context *context;
-+      char orig_value[LIBISCSI_VALUE_MAXLEN], value[LIBISCSI_VALUE_MAXLEN];
-+      int rc = 0;
-+
-+      snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s",
-+               "iqn.2009-01.com.example:testdisk");
-+      node.tpgt = 1;
-+      snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1");
-+      node.port = 3260;
-+
-+      context = libiscsi_init();
-+      if (!context) {
-+              fprintf(stderr, "Error initializing libiscsi\n");
-+              return 1;
-+      }
-+
-+      rc = libiscsi_node_get_parameter(context, &node, "node.startup",
-+              orig_value);
-+      if (rc) {
-+              fprintf(stderr, "Error getting original value: %s\n",
-+                      libiscsi_get_error_string(context));
-+              goto leave;
-+      }
-+
-+      rc = libiscsi_node_set_parameter(context, &node, "node.startup",
-+              "automatic");
-+      if (rc) {
-+              fprintf(stderr, "Error setting node startup param: %s\n",
-+                      libiscsi_get_error_string(context));
-+              goto leave;
-+      }
-+
-+      rc = libiscsi_node_get_parameter(context, &node, "node.startup",
-+              value);
-+      if (rc) {
-+              fprintf(stderr, "Error getting node startup param: %s\n",
-+                      libiscsi_get_error_string(context));
-+              goto leave;
-+      }
-+      
-+      if (strcmp(value, "automatic")) {
-+              fprintf(stderr, "Error set and get values do not match!\n");
-+              rc = EIO;
-+              goto leave;
-+      }
-+
-+      rc = libiscsi_node_set_parameter(context, &node, "node.startup",
-+              orig_value);
-+      if (rc) {
-+              fprintf(stderr, "Error setting original value: %s\n",
-+                      libiscsi_get_error_string(context));
-+              goto leave;
-+      }
-+
-+      rc = libiscsi_node_get_parameter(context, &node, "node.startup",
-+              value);
-+      if (rc) {
-+              fprintf(stderr, "Error re-getting original value: %s\n",
-+                      libiscsi_get_error_string(context));
-+              goto leave;
-+      }
-+
-+      if (strcmp(value, orig_value)) {
-+              fprintf(stderr,
-+                      "Error set and get original values do not match!\n");
-+              rc = EIO;
-+              goto leave;
-+      }
-+
-+leave:
-+      libiscsi_cleanup(context);
-+
-+      return rc;
-+}
-diff --git a/libiscsi/tests/test_set_auth.c b/libiscsi/tests/test_set_auth.c
-new file mode 100644
-index 0000000..a21f888
---- /dev/null
-+++ b/libiscsi/tests/test_set_auth.c
-@@ -0,0 +1,58 @@
-+/*
-+ * iSCSI Administration library
-+ *
-+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
-+ * maintained by open-iscsi@googlegroups.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include "libiscsi.h"
-+
-+int main(void)
-+{
-+      struct libiscsi_node node;
-+      struct libiscsi_context *context;
-+      struct libiscsi_auth_info auth_info;
-+      int rc = 0;
-+
-+      snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s",
-+               "iqn.2009-01.com.example:testdisk");
-+      node.tpgt = 1;
-+      snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1");
-+      node.port = 3260;
-+
-+      memset(&auth_info, 0, sizeof(auth_info));
-+      auth_info.method = libiscsi_auth_chap;
-+      strcpy(auth_info.chap.username, "joe");
-+      strcpy(auth_info.chap.password, "secret");
-+
-+      context = libiscsi_init();
-+      if (!context) {
-+              fprintf(stderr, "Error initializing libiscsi\n");
-+              return 1;
-+      }
-+
-+      rc = libiscsi_node_set_auth(context, &node, &auth_info);
-+      if (rc)
-+              fprintf(stderr, "Error setting authinfo: %s\n",
-+                      libiscsi_get_error_string(context));
-+
-+      libiscsi_cleanup(context);
-+
-+      return rc;
-+}
-diff --git a/usr/Makefile b/usr/Makefile
-index 1506111..015f1b9 100644
---- a/usr/Makefile
-+++ b/usr/Makefile
-@@ -31,7 +31,7 @@ endif
- OPTFLAGS ?= -O2 -g
- WARNFLAGS ?= -Wall -Wstrict-prototypes
- CFLAGS += $(OPTFLAGS) $(WARNFLAGS) -I../include -I. -I../utils/open-isns \
--                              -D$(OSNAME) $(IPC_CFLAGS)
-+                              -D$(OSNAME) $(IPC_CFLAGS) -DISNS_ENABLE
- PROGRAMS = iscsid iscsiadm iscsistart
- # libc compat files
-diff --git a/usr/discovery.c b/usr/discovery.c
-index afce6c0..0c93749 100644
---- a/usr/discovery.c
-+++ b/usr/discovery.c
-@@ -36,6 +36,7 @@
- #include "types.h"
- #include "iscsi_proto.h"
- #include "initiator.h"
-+#include "config.h"
- #include "log.h"
- #include "idbm.h"
- #include "iscsi_settings.h"
-@@ -50,9 +51,11 @@
- #include "iscsi_timer.h"
- #include "iscsi_err.h"
- /* libisns includes */
-+#ifdef ISNS_ENABLE
- #include "isns.h"
- #include "paths.h"
- #include "message.h"
-+#endif
- #ifdef SLP_ENABLE
- #include "iscsi-slp-discovery.h"
-@@ -98,6 +101,7 @@ static int request_initiator_name(void)
-       return 0;
- }
-+#ifdef ISNS_ENABLE
- void discovery_isns_free_servername(void)
- {
-       if (isns_config.ic_server_name)
-@@ -377,6 +381,7 @@ retry:
-       discovery_isns_free_servername();
-       return rc;
- }
-+#endif
- int discovery_fw(void *data, struct iface_rec *iface,
-                struct list_head *rec_list)
-diff --git a/usr/idbm.c b/usr/idbm.c
-index 806d90e..c20f7d9 100644
---- a/usr/idbm.c
-+++ b/usr/idbm.c
-@@ -1335,9 +1335,9 @@ int idbm_print_all_discovery(int info_level)
-  * fn should return -1 if it skipped the rec, a ISCSI_ERR error code if
-  * the operation failed or 0 if fn was run successfully.
-  */
--static int idbm_for_each_iface(int *found, void *data,
--                              idbm_iface_op_fn *fn,
--                              char *targetname, int tpgt, char *ip, int port)
-+int idbm_for_each_iface(int *found, void *data,
-+                      idbm_iface_op_fn *fn,
-+                      char *targetname, int tpgt, char *ip, int port)
- {
-       DIR *iface_dirfd;
-       struct dirent *iface_dent;
-diff --git a/usr/idbm.h b/usr/idbm.h
-index 5d81df7..f645561 100644
---- a/usr/idbm.h
-+++ b/usr/idbm.h
-@@ -101,6 +101,9 @@ struct rec_op_data {
-       node_rec_t *match_rec;
-       idbm_iface_op_fn *fn;
- };
-+extern int idbm_for_each_iface(int *found, void *data,
-+                             idbm_iface_op_fn *fn,
-+                             char *targetname, int tpgt, char *ip, int port);
- extern int idbm_for_each_portal(int *found, void *data,
-                               idbm_portal_op_fn *fn, char *targetname);
- extern int idbm_for_each_node(int *found, void *data,
-diff --git a/usr/iscsi_ipc.h b/usr/iscsi_ipc.h
-index db5f1f0..e0bf051 100644
---- a/usr/iscsi_ipc.h
-+++ b/usr/iscsi_ipc.h
-@@ -147,4 +147,6 @@ struct iscsi_ipc {
-                           uint16_t chap_tbl_idx);
- };
-+struct iscsi_ipc *ipc;
-+
- #endif /* ISCSI_IPC_H */
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0055-dont-use-static.patch b/iscsi-initiator-utils/patches/0055-dont-use-static.patch
deleted file mode 100644 (file)
index 9e43b7b..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From ff224a16d409c4b479b3ac1ff662093cb067e281 Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Mon, 19 Nov 2012 17:04:29 -0800
-Subject: dont use static
-
----
- usr/Makefile | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/usr/Makefile b/usr/Makefile
-index 015f1b9..1669890 100644
---- a/usr/Makefile
-+++ b/usr/Makefile
-@@ -61,7 +61,7 @@ iscsiadm: $(ISCSI_LIB_SRCS) $(DISCOVERY_SRCS) iscsiadm.o session_mgmt.o
- iscsistart: $(ISCSI_LIB_SRCS) $(INITIATOR_SRCS) $(FW_BOOT_SRCS) \
-               iscsistart.o statics.o
--      $(CC) $(CFLAGS) -static $^ -o $@
-+      $(CC) $(CFLAGS) $^ -o $@
- clean:
-       rm -f *.o $(PROGRAMS) .depend $(LIBSYS)
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0056-remove-the-offload-boot-supported-ifdef.patch b/iscsi-initiator-utils/patches/0056-remove-the-offload-boot-supported-ifdef.patch
deleted file mode 100644 (file)
index a1ccdc7..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-From aa58a042ec20575143c1a5c813c9552a286aeb0e Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Mon, 19 Nov 2012 17:09:24 -0800
-Subject: remove the offload boot supported ifdef
-
----
- usr/iface.c | 7 +------
- 1 file changed, 1 insertion(+), 6 deletions(-)
-
-diff --git a/usr/iface.c b/usr/iface.c
-index c86892e..f5441c0 100644
---- a/usr/iface.c
-+++ b/usr/iface.c
-@@ -895,6 +895,7 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
- {
-       struct iscsi_transport *t = NULL;
-       uint32_t hostno;
-+      int rc;
-       if (strlen(context->initiatorname))
-               strlcpy(iface->iname, context->initiatorname,
-@@ -907,10 +908,7 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
-                       return 0;
-               }
-       } else if (strlen(context->iface)) {
--/* this ifdef is only temp until distros and firmwares are updated */
--#ifdef OFFLOAD_BOOT_SUPPORTED
-               char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN];
--              int rc;
-               memset(transport_name, 0, ISCSI_TRANSPORT_NAME_MAXLEN);
-               /* make sure offload driver is loaded */
-@@ -936,9 +934,6 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
-               }
-               strlcpy(iface->netdev, context->iface, sizeof(iface->netdev));
--#else
--              return 0;
--#endif
-       } else
-               return 0;
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0057-iscsid-iscsiuio-ipc-interface.patch b/iscsi-initiator-utils/patches/0057-iscsid-iscsiuio-ipc-interface.patch
deleted file mode 100644 (file)
index 2335aa3..0000000
+++ /dev/null
@@ -1,611 +0,0 @@
-From 59b5b828b2a763f47fb205aedf202990d64e748c Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Mon, 24 Dec 2012 13:37:53 -0800
-Subject: iscsid iscsiuio ipc interface
-
----
- include/iscsi_err.h    |   2 +
- usr/Makefile           |   3 +-
- usr/initiator.c        | 113 ++++++++++++++++++++++++++++++++++++++++++++++++-
- usr/initiator.h        |   4 ++
- usr/initiator_common.c |  34 +++++++++++++++
- usr/iscsi_err.c        |   1 +
- usr/iscsid_req.c       |  91 +++++++++++++++++++++++++++++++++++++--
- usr/iscsid_req.h       |   2 +
- usr/transport.c        |   2 +
- usr/transport.h        |   3 ++
- usr/uip_mgmt_ipc.c     |  41 ++++++++++++++++++
- usr/uip_mgmt_ipc.h     |  73 ++++++++++++++++++++++++++++++++
- 12 files changed, 364 insertions(+), 5 deletions(-)
- create mode 100644 usr/uip_mgmt_ipc.c
- create mode 100644 usr/uip_mgmt_ipc.h
-
-diff --git a/include/iscsi_err.h b/include/iscsi_err.h
-index aabea4e..1139133 100644
---- a/include/iscsi_err.h
-+++ b/include/iscsi_err.h
-@@ -62,6 +62,8 @@ enum {
-       ISCSI_ERR_OP_NOT_SUPP           = 27,
-       /* device or resource in use */
-       ISCSI_ERR_BUSY                  = 28,
-+      /* Operation failed, but retrying layer may succeed */
-+      ISCSI_ERR_AGAIN                 = 29,
-       /* Always last. Indicates end of error code space */
-       ISCSI_MAX_ERR_VAL,
-diff --git a/usr/Makefile b/usr/Makefile
-index 1669890..5bf5f83 100644
---- a/usr/Makefile
-+++ b/usr/Makefile
-@@ -40,7 +40,8 @@ SYSDEPS_SRCS = $(wildcard ../utils/sysdeps/*.o)
- ISCSI_LIB_SRCS = iscsi_util.o io.o auth.o iscsi_timer.o login.o log.o md5.o \
-       sha1.o iface.o idbm.o sysfs.o host.o session_info.o iscsi_sysfs.o \
-       iscsi_net_util.o iscsid_req.o transport.o iser.o cxgbi.o be2iscsi.o \
--      initiator_common.o iscsi_err.o iscsi_param.o $(IPC_OBJ)  $(SYSDEPS_SRCS)
-+      initiator_common.o iscsi_err.o iscsi_param.o uip_mgmt_ipc.o \
-+      $(IPC_OBJ)  $(SYSDEPS_SRCS)
- # core initiator files
- INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o kern_err_table.o
-diff --git a/usr/initiator.c b/usr/initiator.c
-index d475358..597e0ff 100644
---- a/usr/initiator.c
-+++ b/usr/initiator.c
-@@ -45,6 +45,7 @@
- #include "iscsi_sysfs.h"
- #include "iscsi_settings.h"
- #include "iface.h"
-+#include "host.h"
- #include "sysdeps.h"
- #include "iscsi_err.h"
- #include "kern_err_table.h"
-@@ -557,6 +558,48 @@ static int iscsi_conn_connect(struct iscsi_conn *conn, queue_task_t *qtask)
-       return 0;
- }
-+static void iscsi_uio_poll_login_timedout(void *data)
-+{
-+      struct queue_task *qtask = data;
-+      struct iscsi_conn *conn = qtask->conn;
-+      iscsi_session_t *session = conn->session;
-+
-+      log_debug(3, "timeout waiting for UIO ...\n");
-+      mgmt_ipc_write_rsp(qtask, ISCSI_ERR_TRANS_TIMEOUT);
-+      conn_delete_timers(conn);
-+      __session_destroy(session);
-+}
-+
-+static int iscsi_sched_uio_poll(queue_task_t *qtask)
-+{
-+      struct iscsi_conn *conn = qtask->conn;
-+      struct iscsi_session *session = conn->session;
-+      struct iscsi_transport *t = session->t;
-+      struct iscsi_ev_context *ev_context;
-+
-+      if (!t->template->set_net_config)
-+              return 0;
-+
-+      ev_context = iscsi_ev_context_get(conn, 0);
-+      if (!ev_context) {
-+              /* while reopening the recv pool should be full */
-+              log_error("BUG: __session_conn_reopen could "
-+                        "not get conn context for recv.");
-+              return ENOMEM;
-+      }
-+
-+      ev_context->data = qtask;
-+      conn->state = ISCSI_CONN_STATE_XPT_WAIT;
-+
-+      iscsi_sched_ev_context(ev_context, conn, 0, EV_UIO_POLL);
-+
-+      log_debug(3, "Setting login UIO poll timer %p timeout %d",
-+                &conn->login_timer, conn->login_timeout);
-+      actor_timer(&conn->login_timer, conn->login_timeout * 1000,
-+                  iscsi_uio_poll_login_timedout, qtask);
-+      return EAGAIN;
-+}
-+
- static void
- __session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop,
-                     int redirected)
-@@ -598,6 +641,11 @@ __session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop,
-       if (!redirected)
-               session->reopen_cnt++;
-+      /* uIP will needs to be re-triggered on the connection re-open */
-+      if (iscsi_set_net_config(conn->session->t, conn->session,
-+                               &conn->session->nrec.iface) != 0)
-+              goto queue_reopen;
-+
-       if (iscsi_conn_connect(conn, qtask)) {
-               delay = ISCSI_CONN_ERR_REOPEN_DELAY;
-               goto queue_reopen;
-@@ -1670,6 +1718,53 @@ failed_login:
- }
-+static void session_conn_uio_poll(void *data)
-+{
-+      struct iscsi_ev_context *ev_context = data;
-+      iscsi_conn_t *conn = ev_context->conn;
-+      struct iscsi_session *session = conn->session;
-+      queue_task_t *qtask = ev_context->data;
-+      int rc;
-+
-+      log_debug(4, "retrying uio poll");
-+      rc = iscsi_set_net_config(session->t, session,
-+                                &conn->session->nrec.iface);
-+      if (rc != 0) {
-+              if (rc == ISCSI_ERR_AGAIN) {
-+                      ev_context->data = qtask;
-+                      iscsi_sched_ev_context(ev_context, conn, 2,
-+                                             EV_UIO_POLL);
-+                      return;
-+              } else {
-+                      log_error("session_conn_uio_poll() "
-+                                "connection failure [0x%x]", rc);
-+                      actor_delete(&conn->login_timer);
-+                      iscsi_login_eh(conn, qtask, ISCSI_ERR_INTERNAL);
-+                      iscsi_ev_context_put(ev_context);
-+                      return;
-+              }
-+      }
-+
-+      iscsi_ev_context_put(ev_context);
-+      actor_delete(&conn->login_timer);
-+      log_debug(4, "UIO ready trying connect");
-+
-+      /*  uIP is ready try to connect */
-+      if (gettimeofday(&conn->initial_connect_time, NULL))
-+              log_error("Could not get initial connect time. If "
-+                        "login errors iscsid may give up the initial "
-+                        "login early. You should manually login.");
-+
-+      conn->state = ISCSI_CONN_STATE_XPT_WAIT;
-+      if (iscsi_conn_connect(conn, qtask)) {
-+              int delay = ISCSI_CONN_ERR_REOPEN_DELAY;
-+
-+              log_debug(4, "Waiting %u seconds before trying to reconnect.\n",
-+                        delay);
-+              queue_delayed_reopen(qtask, delay);
-+      }
-+}
-+
- static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context,
-                                 struct iscsi_conn *conn, unsigned long tmo,
-                                 int event)
-@@ -1711,6 +1806,11 @@ static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context,
-                         ev_context);
-               actor_schedule(&ev_context->actor);
-               break;
-+      case EV_UIO_POLL:
-+              actor_new(&ev_context->actor, session_conn_uio_poll,
-+                        ev_context);
-+              actor_schedule(&ev_context->actor);
-+              break;
-       case EV_CONN_LOGOUT_TIMER:
-               actor_timer(&ev_context->actor, tmo * 1000,
-                           iscsi_logout_timedout, ev_context);
-@@ -1844,7 +1944,17 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask)
-       conn = &session->conn[0];
-       qtask->conn = conn;
--      if (iscsi_host_set_net_params(&rec->iface, session)) {
-+      rc = iscsi_host_set_net_params(&rec->iface, session);
-+      if (rc == ISCSI_ERR_AGAIN) {
-+              iscsi_sched_uio_poll(qtask);
-+              /*
-+               * Cannot block iscsid, so caller is going to internally
-+               * retry the operation.
-+               */
-+              qtask->rsp.command = MGMT_IPC_SESSION_LOGIN;
-+              qtask->rsp.err = ISCSI_SUCCESS;
-+              return ISCSI_SUCCESS;
-+      } else if (rc) {
-               __session_destroy(session);
-               return ISCSI_ERR_LOGIN;
-       }
-@@ -2001,6 +2111,7 @@ iscsi_host_send_targets(queue_task_t *qtask, int host_no, int do_login,
-                       struct sockaddr_storage *ss)
- {
-       struct iscsi_transport *t;
-+      int rc;
-       t = iscsi_sysfs_get_transport_by_hba(host_no);
-       if (!t) {
-diff --git a/usr/initiator.h b/usr/initiator.h
-index b45caab..d6dc02e 100644
---- a/usr/initiator.h
-+++ b/usr/initiator.h
-@@ -83,6 +83,7 @@ typedef enum iscsi_event_e {
-       EV_CONN_LOGOUT_TIMER,
-       EV_CONN_STOP,
-       EV_CONN_LOGIN,
-+      EV_UIO_POLL,
- } iscsi_event_e;
- struct queue_task;
-@@ -353,5 +354,8 @@ extern void iscsi_copy_operational_params(struct iscsi_conn *conn,
- extern int iscsi_setup_authentication(struct iscsi_session *session,
-                                     struct iscsi_auth_config *auth_cfg);
- extern int iscsi_setup_portal(struct iscsi_conn *conn, char *address, int port);
-+extern int iscsi_set_net_config(struct iscsi_transport *t,
-+                              iscsi_session_t *session,
-+                              struct iface_rec *iface);
- #endif /* INITIATOR_H */
-diff --git a/usr/initiator_common.c b/usr/initiator_common.c
-index ef6820c..eb72795 100644
---- a/usr/initiator_common.c
-+++ b/usr/initiator_common.c
-@@ -562,6 +562,36 @@ TODO handle this
-       return 0;
- }
-+int iscsi_set_net_config(struct iscsi_transport *t, iscsi_session_t *session,
-+                       struct iface_rec *iface)
-+{
-+      if (t->template->set_net_config) {
-+              /* uip needs the netdev name */
-+              struct host_info hinfo;
-+              int hostno, rc;
-+
-+              /* this assumes that the netdev or hw address is going to be
-+                 set */
-+              hostno = iscsi_sysfs_get_host_no_from_hwinfo(iface, &rc);
-+              if (rc) {
-+                      log_debug(4, "Couldn't get host no.\n");
-+                      return rc;
-+              }
-+
-+              /* uip needs the netdev name */
-+              if (!strlen(iface->netdev)) {
-+                      memset(&hinfo, 0, sizeof(hinfo));
-+                      hinfo.host_no = hostno;
-+                      iscsi_sysfs_get_hostinfo_by_host_no(&hinfo);
-+                      strcpy(iface->netdev, hinfo.iface.netdev);
-+              }
-+
-+              return t->template->set_net_config(t, iface, session);
-+      }
-+
-+      return 0;
-+}
-+
- int iscsi_host_set_net_params(struct iface_rec *iface,
-                             struct iscsi_session *session)
- {
-@@ -600,6 +630,10 @@ int iscsi_host_set_net_params(struct iface_rec *iface,
-               log_warning("Could not brining up netdev %s. Try running "
-                           "'ifup %s' first if login fails.", netdev, netdev);
-+      rc = iscsi_set_net_config(t, session, iface);
-+      if (rc != 0)
-+              return rc;
-+
-       rc = host_set_param(t, session->hostno,
-                           ISCSI_HOST_PARAM_IPADDRESS,
-                           iface->ipaddress, ISCSI_STRING);
-diff --git a/usr/iscsi_err.c b/usr/iscsi_err.c
-index 4fe1c53..f9ba130 100644
---- a/usr/iscsi_err.c
-+++ b/usr/iscsi_err.c
-@@ -51,6 +51,7 @@ static char *iscsi_err_msgs[] = {
-       /* 26 */ "iSNS registration failed",
-       /* 27 */ "operation not supported",
-       /* 28 */ "device or resource in use",
-+      /* 29 */ "Retryable failure",
- };
- char *iscsi_err_to_str(int err)
-diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c
-index 1c4678d..a436194 100644
---- a/usr/iscsid_req.c
-+++ b/usr/iscsid_req.c
-@@ -22,6 +22,7 @@
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
-+#include <fcntl.h>
- #include <sys/un.h>
- #include <sys/types.h>
- #include <sys/socket.h>
-@@ -32,6 +33,7 @@
- #include "iscsi_util.h"
- #include "config.h"
- #include "iscsi_err.h"
-+#include "uip_mgmt_ipc.h"
- static void iscsid_startup(void)
- {
-@@ -54,7 +56,7 @@ static void iscsid_startup(void)
- #define MAXSLEEP 128
--static int iscsid_connect(int *fd, int start_iscsid)
-+static int ipc_connect(int *fd, char *unix_sock_name, int start_iscsid)
- {
-       int nsec, addr_len;
-       struct sockaddr_un addr;
-@@ -65,11 +67,11 @@ static int iscsid_connect(int *fd, int start_iscsid)
-               return ISCSI_ERR_ISCSID_NOTCONN;
-       }
--      addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1;
-+      addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(unix_sock_name) + 1;
-       memset(&addr, 0, sizeof(addr));
-       addr.sun_family = AF_LOCAL;
--      memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len);
-+      memcpy((char *) &addr.sun_path + 1, unix_sock_name, addr_len);
-       /*
-        * Trying to connect with exponential backoff
-@@ -98,6 +100,11 @@ static int iscsid_connect(int *fd, int start_iscsid)
-       return ISCSI_ERR_ISCSID_NOTCONN;
- }
-+static int iscsid_connect(int *fd, int start_iscsid)
-+{
-+      return ipc_connect(fd, ISCSIADM_NAMESPACE, start_iscsid);
-+}
-+
- int iscsid_request(int *fd, iscsiadm_req_t *req, int start_iscsid)
- {
-       int err;
-@@ -194,3 +201,81 @@ int iscsid_req_by_sid(iscsiadm_cmd_e cmd, int sid)
-               return err;
-       return iscsid_req_wait(cmd, fd);
- }
-+
-+static int uip_connect(int *fd)
-+{
-+      return ipc_connect(fd, ISCSID_UIP_NAMESPACE, 0);
-+}
-+
-+int uip_broadcast(void *buf, size_t buf_len)
-+{
-+      int err;
-+      int fd;
-+      iscsid_uip_rsp_t rsp;
-+      int flags;
-+      int count;
-+
-+      err = uip_connect(&fd);
-+      if (err) {
-+              log_warning("uIP daemon is not up");
-+              return err;
-+      }
-+
-+      log_debug(3, "connected to uIP daemon");
-+
-+      /*  Send the data to uIP */
-+      if ((err = write(fd, buf, buf_len)) != buf_len) {
-+              log_error("got write error (%d/%d), daemon died?",
-+                        err, errno);
-+              close(fd);
-+              return ISCSI_ERR_ISCSID_COMM_ERR;
-+      }
-+
-+      log_debug(3, "send iface config to uIP daemon");
-+
-+      /*  Set the socket to a non-blocking read, this way if there are
-+       *  problems waiting for uIP, iscsid can bailout early */
-+      flags = fcntl(fd, F_GETFL, 0);
-+      if (flags == -1)
-+              flags = 0;
-+      err = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
-+      if(err != 0) {
-+              log_error("could not set uip broadcast to non-blocking: %d",
-+                        errno);
-+              close(fd);
-+              return ISCSI_ERR;
-+      }
-+
-+#define MAX_UIP_BROADCAST_READ_TRIES 3
-+      for(count = 0; count < MAX_UIP_BROADCAST_READ_TRIES; count++) {
-+              /*  Wait for the response */
-+              err = read(fd, &rsp, sizeof(rsp));
-+              if (err == sizeof(rsp)) {
-+                      log_debug(3, "Broadcasted to uIP with length: %ld "
-+                                   "cmd: 0x%x rsp: 0x%x\n", buf_len,
-+                                   rsp.command, rsp.err);
-+                      err = 0;
-+                      break;
-+              } else if((err == -1) && (errno == EAGAIN)) {
-+                      usleep(250000);
-+                      continue;
-+              } else {
-+                      log_error("Could not read response (%d/%d), daemon died?",
-+                                err, errno);
-+                      err = ISCSI_ERR;
-+                      break;
-+              }
-+      }
-+
-+      if (count == MAX_UIP_BROADCAST_READ_TRIES) {
-+              log_error("Could not broadcast to uIP after %d tries",
-+                        count);
-+              err = ISCSI_ERR_AGAIN;
-+      } else if (rsp.err != ISCISD_UIP_MGMT_IPC_DEVICE_UP) {
-+              log_debug(3, "Device is not ready\n");
-+              err = ISCSI_ERR_AGAIN;
-+      }
-+
-+      close(fd);
-+      return err;
-+}
-diff --git a/usr/iscsid_req.h b/usr/iscsid_req.h
-index 68f5256..4fff43d 100644
---- a/usr/iscsid_req.h
-+++ b/usr/iscsid_req.h
-@@ -33,4 +33,6 @@ extern int iscsid_req_by_rec(int cmd, struct node_rec *rec);
- extern int iscsid_req_by_sid_async(int cmd, int sid, int *fd);
- extern int iscsid_req_by_sid(int cmd, int sid);
-+extern int uip_broadcast(void *buf, size_t buf_len);
-+
- #endif
-diff --git a/usr/transport.c b/usr/transport.c
-index e6e3dfc..10212af 100644
---- a/usr/transport.c
-+++ b/usr/transport.c
-@@ -35,6 +35,7 @@
- #include "log.h"
- #include "iscsi_util.h"
- #include "iscsi_sysfs.h"
-+#include "uip_mgmt_ipc.h"
- #include "cxgbi.h"
- #include "be2iscsi.h"
- #include "iser.h"
-@@ -79,6 +80,7 @@ struct iscsi_transport_template bnx2i = {
-       .ep_connect     = ktransport_ep_connect,
-       .ep_poll        = ktransport_ep_poll,
-       .ep_disconnect  = ktransport_ep_disconnect,
-+      .set_net_config = uip_broadcast_params,
- };
- struct iscsi_transport_template be2iscsi = {
-diff --git a/usr/transport.h b/usr/transport.h
-index 672561b..5dcf872 100644
---- a/usr/transport.h
-+++ b/usr/transport.h
-@@ -35,6 +35,9 @@ struct iscsi_transport_template {
-       int (*ep_poll) (struct iscsi_conn *conn, int timeout_ms);
-       void (*ep_disconnect) (struct iscsi_conn *conn);
-       void (*create_conn) (struct iscsi_conn *conn);
-+      int (*set_net_config) (struct iscsi_transport *t,
-+                             struct iface_rec *iface,
-+                             struct iscsi_session *session);
- };
- /* represents data path provider */
-diff --git a/usr/uip_mgmt_ipc.c b/usr/uip_mgmt_ipc.c
-new file mode 100644
-index 0000000..73b1632
---- /dev/null
-+++ b/usr/uip_mgmt_ipc.c
-@@ -0,0 +1,41 @@
-+/*
-+ * uIP iSCSI Daemon/Admin Management IPC
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+
-+#include <string.h>
-+
-+#include "log.h"
-+#include "uip_mgmt_ipc.h"
-+#include "iscsid_req.h"
-+
-+int uip_broadcast_params(struct iscsi_transport *t,
-+                       struct iface_rec *iface,
-+                       struct iscsi_session *session)
-+{
-+      struct iscsid_uip_broadcast broadcast;
-+
-+        log_debug(3, "broadcasting to uip\n");
-+
-+      memset(&broadcast, 0, sizeof(broadcast));
-+
-+      broadcast.header.command = ISCSID_UIP_IPC_GET_IFACE;
-+      broadcast.header.payload_len = sizeof(*iface);
-+
-+      memcpy(&broadcast.u.iface_rec, iface, sizeof(*iface));
-+
-+      return uip_broadcast(&broadcast,
-+                           sizeof(iscsid_uip_broadcast_header_t) +
-+                           sizeof(*iface));
-+}
-diff --git a/usr/uip_mgmt_ipc.h b/usr/uip_mgmt_ipc.h
-new file mode 100644
-index 0000000..3859688
---- /dev/null
-+++ b/usr/uip_mgmt_ipc.h
-@@ -0,0 +1,73 @@
-+/*
-+ * uIP iSCSI Daemon/Admin Management IPC
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published
-+ * by the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * See the file COPYING included with this distribution for more details.
-+ */
-+#ifndef UIP_MGMT_IPC_H
-+#define UIP_MGMT_IPC_H
-+
-+#include "types.h"
-+#include "iscsi_if.h"
-+#include "config.h"
-+#include "mgmt_ipc.h"
-+
-+#include "initiator.h"
-+#include "transport.h"
-+
-+#define ISCSID_UIP_NAMESPACE  "ISCSID_UIP_ABSTRACT_NAMESPACE"
-+
-+typedef enum iscsid_uip_cmd {
-+      ISCSID_UIP_IPC_UNKNOWN                  = 0,
-+      ISCSID_UIP_IPC_GET_IFACE                = 1,
-+
-+        __ISCSID_UIP_IPC_MAX_COMMAND
-+} iscsid_uip_cmd_e;
-+
-+typedef struct iscsid_uip_broadcast_header {
-+      iscsid_uip_cmd_e command;
-+      uint32_t payload_len;
-+} iscsid_uip_broadcast_header_t;
-+
-+/* IPC Request */
-+typedef struct iscsid_uip_broadcast {
-+      struct iscsid_uip_broadcast_header header;
-+
-+      union {
-+              /* messages */
-+              struct ipc_broadcast_iface_rec {
-+                      struct iface_rec rec;
-+              } iface_rec;
-+      } u;
-+} iscsid_uip_broadcast_t;
-+
-+typedef enum iscsid_uip_mgmt_ipc_err {
-+      ISCSID_UIP_MGMT_IPC_OK                     = 0,
-+        ISCISD_UIP_MGMT_IPC_ERR                    = 1,
-+        ISCISD_UIP_MGMT_IPC_ERR_NOT_FOUND          = 2,
-+        ISCISD_UIP_MGMT_IPC_ERR_NOMEM              = 3,
-+      ISCISD_UIP_MGMT_IPC_DEVICE_UP              = 4,
-+      ISCISD_UIP_MGMT_IPC_DEVICE_INITIALIZING    = 5,
-+} iscsid_uip_mgmt_ipc_err_e;
-+
-+/* IPC Response */
-+typedef struct iscsid_uip_mgmt_rsp {
-+      iscsid_uip_cmd_e command;
-+      iscsid_uip_mgmt_ipc_err_e err;
-+} iscsid_uip_rsp_t;
-+
-+extern int uip_broadcast_params(struct iscsi_transport *t,
-+                              struct iface_rec *iface,
-+                              struct iscsi_session *session);
-+
-+
-+#endif /* UIP_MGMT_IPC_H */
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0058-iscsiuio-IPC-newroot-command.patch b/iscsi-initiator-utils/patches/0058-iscsiuio-IPC-newroot-command.patch
deleted file mode 100644 (file)
index 2680f22..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-From e74f511ba862195d909bba90091fd84bd7904914 Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Wed, 2 Jan 2013 14:45:05 -0800
-Subject: iscsiuio IPC newroot command
-
----
- usr/mgmt_ipc.c     | 11 +++++++++++
- usr/transport.c    |  1 +
- usr/transport.h    |  1 +
- usr/uip_mgmt_ipc.c | 14 ++++++++++++++
- usr/uip_mgmt_ipc.h |  5 +++++
- 5 files changed, 32 insertions(+)
-
-diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c
-index 5cb7143..a8f8473 100644
---- a/usr/mgmt_ipc.c
-+++ b/usr/mgmt_ipc.c
-@@ -36,6 +36,7 @@
- #include "sysdeps.h"
- #include "iscsi_ipc.h"
- #include "iscsi_err.h"
-+#include "iscsi_sysfs.h"
- #define PEERUSER_MAX  64
- #define EXTMSG_MAX    (64 * 1024)
-@@ -229,8 +230,18 @@ static int
- mgmt_ipc_newroot(queue_task_t *qtask)
- {
-       char *newroot = qtask->req.u.newroot.path;
-+      struct iscsi_transport *t;
-+
-       if (chdir(newroot) || chroot(".") || chdir("/"))
-               return ISCSI_ERR;
-+
-+      /* if a registered transport has a separate userspace process,
-+       * notify it of the root change as well */
-+      list_for_each_entry(t, &transports, list) {
-+              if (t->template->newroot)
-+                      t->template->newroot(t, newroot);
-+      }
-+
-       mgmt_ipc_write_rsp(qtask, ISCSI_SUCCESS);
-       return ISCSI_SUCCESS;
- }
-diff --git a/usr/transport.c b/usr/transport.c
-index 10212af..02ad717 100644
---- a/usr/transport.c
-+++ b/usr/transport.c
-@@ -81,6 +81,7 @@ struct iscsi_transport_template bnx2i = {
-       .ep_poll        = ktransport_ep_poll,
-       .ep_disconnect  = ktransport_ep_disconnect,
-       .set_net_config = uip_broadcast_params,
-+      .newroot        = uip_broadcast_newroot,
- };
- struct iscsi_transport_template be2iscsi = {
-diff --git a/usr/transport.h b/usr/transport.h
-index 5dcf872..eb3a946 100644
---- a/usr/transport.h
-+++ b/usr/transport.h
-@@ -38,6 +38,7 @@ struct iscsi_transport_template {
-       int (*set_net_config) (struct iscsi_transport *t,
-                              struct iface_rec *iface,
-                              struct iscsi_session *session);
-+      void (*newroot) (struct iscsi_transport *t, char *path);
- };
- /* represents data path provider */
-diff --git a/usr/uip_mgmt_ipc.c b/usr/uip_mgmt_ipc.c
-index 73b1632..9fa5398 100644
---- a/usr/uip_mgmt_ipc.c
-+++ b/usr/uip_mgmt_ipc.c
-@@ -39,3 +39,17 @@ int uip_broadcast_params(struct iscsi_transport *t,
-                            sizeof(iscsid_uip_broadcast_header_t) +
-                            sizeof(*iface));
- }
-+
-+int uip_broadcast_newroot(struct iscsi_transport *t, char *newroot)
-+{
-+      struct iscsid_uip_broadcast broadcast;
-+
-+      memset(&broadcast, 0, sizeof(broadcast));
-+
-+      broadcast.header.command = ISCSID_UIP_NEWROOT;
-+      strncpy(broadcast.u.newroot.path, newroot, PATH_MAX);
-+
-+      return uip_broadcast(&broadcast,
-+                           sizeof(iscsid_uip_broadcast_header_t) +
-+                           PATH_MAX + 1);
-+}
-diff --git a/usr/uip_mgmt_ipc.h b/usr/uip_mgmt_ipc.h
-index 3859688..9de88c2 100644
---- a/usr/uip_mgmt_ipc.h
-+++ b/usr/uip_mgmt_ipc.h
-@@ -29,6 +29,7 @@
- typedef enum iscsid_uip_cmd {
-       ISCSID_UIP_IPC_UNKNOWN                  = 0,
-       ISCSID_UIP_IPC_GET_IFACE                = 1,
-+      ISCSID_UIP_NEWROOT                      = 2,
-         __ISCSID_UIP_IPC_MAX_COMMAND
- } iscsid_uip_cmd_e;
-@@ -47,6 +48,9 @@ typedef struct iscsid_uip_broadcast {
-               struct ipc_broadcast_iface_rec {
-                       struct iface_rec rec;
-               } iface_rec;
-+              struct ipc_broadcast_newroot {
-+                      char path[PATH_MAX + 1];
-+              } newroot;
-       } u;
- } iscsid_uip_broadcast_t;
-@@ -69,5 +73,6 @@ extern int uip_broadcast_params(struct iscsi_transport *t,
-                               struct iface_rec *iface,
-                               struct iscsi_session *session);
-+extern int uip_broadcast_newroot(struct iscsi_transport *t, char *path);
- #endif /* UIP_MGMT_IPC_H */
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0059-iscsiuio-systemd-unit-files.patch b/iscsi-initiator-utils/patches/0059-iscsiuio-systemd-unit-files.patch
deleted file mode 100644 (file)
index 2d0e213..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-From 822b53e6c9ebb0fe7236ebd3b4c73b009100592d Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Tue, 22 Jan 2013 14:27:12 -0800
-Subject: iscsiuio systemd unit files
-
----
- etc/systemd/iscsiuio.service | 17 +++++++++++++++++
- etc/systemd/iscsiuio.socket  |  9 +++++++++
- 2 files changed, 26 insertions(+)
- create mode 100644 etc/systemd/iscsiuio.service
- create mode 100644 etc/systemd/iscsiuio.socket
-
-diff --git a/etc/systemd/iscsiuio.service b/etc/systemd/iscsiuio.service
-new file mode 100644
-index 0000000..f0410b7
---- /dev/null
-+++ b/etc/systemd/iscsiuio.service
-@@ -0,0 +1,17 @@
-+[Unit]
-+Description=iSCSI UserSpace I/O driver
-+Documentation=man:iscsiuio(8)
-+DefaultDependencies=no
-+Conflicts=shutdown.target
-+Requires=iscsid.service
-+BindTo=iscsid.service
-+After=network.target
-+Before=remote-fs-pre.target iscsid.service
-+
-+[Service]
-+Type=forking
-+PIDFile=/var/run/iscsiuio.pid
-+ExecStart=/usr/sbin/iscsiuio
-+
-+[Install]
-+WantedBy=multi-user.target
-diff --git a/etc/systemd/iscsiuio.socket b/etc/systemd/iscsiuio.socket
-new file mode 100644
-index 0000000..d42cedc
---- /dev/null
-+++ b/etc/systemd/iscsiuio.socket
-@@ -0,0 +1,9 @@
-+[Unit]
-+Description=Open-iSCSI iscsiuio Socket
-+Documentation=man:iscsiuio(8)
-+
-+[Socket]
-+ListenStream=@ISCSID_UIP_ABSTRACT_NAMESPACE
-+
-+[Install]
-+WantedBy=sockets.target
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0060-use-systemctl-to-start-iscsid.patch b/iscsi-initiator-utils/patches/0060-use-systemctl-to-start-iscsid.patch
deleted file mode 100644 (file)
index 81aa2a3..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From c3d2b8f3de5b6161845304cf46982d2c5a9918b6 Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Thu Feb 21 21:05:39 PST 2013
-Subject: disable iscsid.startup from iscsiadm, prefer systemd socket activation
-
----
- etc/iscsid.conf | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/etc/iscsid.conf b/etc/iscsid.conf
-index ac1d231..5851fa5 100644
---- a/etc/iscsid.conf
-+++ b/etc/iscsid.conf
-@@ -17,7 +17,7 @@
- # maintainers.
- #
- # Default for Fedora and RHEL. (uncomment to activate).
--iscsid.startup = /etc/rc.d/init.d/iscsid force-start
-+#iscsid.startup = /bin/systemctl start iscsid.service
- # 
- # Default for upstream open-iscsi scripts (uncomment to activate).
- # iscsid.startup = /sbin/iscsid
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0061-resolve-565245-multilib-issues-caused-by-doxygen.patch b/iscsi-initiator-utils/patches/0061-resolve-565245-multilib-issues-caused-by-doxygen.patch
deleted file mode 100644 (file)
index 1f64d9c..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-From bc4cf1487b4d6039de2a082c1786ac83ab148c88 Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Tue, 22 Jan 2013 15:14:21 -0800
-Subject: resolve 565245: multilib issues caused by doxygen
-
----
- libiscsi/libiscsi.doxy       | 2 +-
- libiscsi/no_date_footer.html | 6 ++++++
- 2 files changed, 7 insertions(+), 1 deletion(-)
- create mode 100644 libiscsi/no_date_footer.html
-
-diff --git a/libiscsi/libiscsi.doxy b/libiscsi/libiscsi.doxy
-index 663770f..7a5ff7f 100644
---- a/libiscsi/libiscsi.doxy
-+++ b/libiscsi/libiscsi.doxy
-@@ -765,7 +765,7 @@ HTML_HEADER            =
- # each generated HTML page. If it is left blank doxygen will generate a 
- # standard footer.
--HTML_FOOTER            = 
-+HTML_FOOTER            = no_date_footer.html
- # The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
- # style sheet that is used by each HTML page. It can be used to 
-diff --git a/libiscsi/no_date_footer.html b/libiscsi/no_date_footer.html
-new file mode 100644
-index 0000000..1e0c6c4
---- /dev/null
-+++ b/libiscsi/no_date_footer.html
-@@ -0,0 +1,6 @@
-+<hr size="1"><address style="text-align: right;"><small>
-+Generated for $projectname by <a href="http://www.doxygen.org/
-+index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a>
-+$doxygenversion</small></address>
-+</body>
-+</html>
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/patches/0062-Don-t-check-for-autostart-sessions-if-iscsi-is-not-u.patch b/iscsi-initiator-utils/patches/0062-Don-t-check-for-autostart-sessions-if-iscsi-is-not-u.patch
deleted file mode 100644 (file)
index 684463f..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-From ab79bdb20e37216ca969e06d63a952acfd023963 Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Tue, 28 May 2013 13:12:27 -0700
-Subject: [PATCH] Don't check for autostart sessions if iscsi is not used (bug
- #951951)
-
-Change conditional startup in iscsi.service to check for a non-empty
-nodes directory, instead of initiator-name.  This fits better with what
-it's doing, as there's no need to scan for autostart node records if
-there are no node records at all.
----
- etc/systemd/iscsi.service | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service
-index bbd52fd..7b4efee 100644
---- a/etc/systemd/iscsi.service
-+++ b/etc/systemd/iscsi.service
-@@ -5,7 +5,7 @@ DefaultDependencies=no
- Conflicts=shutdown.target
- After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service
- Before=remote-fs-pre.target
--ConditionPathExists=/etc/iscsi/initiatorname.iscsi
-+ConditionDirectoryNotEmpty=/var/lib/iscsi/nodes
- [Service]
- Type=oneshot
--- 
-1.8.1.4
-
diff --git a/iscsi-initiator-utils/patches/0063-fix-order-of-setting-uid-gid-and-drop-supplementary-.patch b/iscsi-initiator-utils/patches/0063-fix-order-of-setting-uid-gid-and-drop-supplementary-.patch
deleted file mode 100644 (file)
index cedb4e0..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-From 3cac85a3f97d0a22270166f428209f873b58c319 Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Tue, 11 Jun 2013 11:25:27 -0700
-Subject: [PATCH] iscsid: fix order of setting uid/gid and drop supplementary
- groups
-
-If using the user and group ID settings together the existing order of
-calling setuid first will almost always cause the setgid call to fail,
-assuming the new effective user id does not have the CAP_SETGID
-capability.  The effective group ID needs to change first.
-
-While we're at it, if iscsid is started as root it should drop any
-inherited supplementary group permissions.
-
-And if anyone is actually using this to try and isolate capabilities,
-they probably care enough to want to known that it is failing.  Make
-iscsid startup fail instead of just calling perror.
-
-Signed-off-by: Chris Leech <cleech@redhat.com>
----
- usr/iscsid.c | 23 +++++++++++++++++++----
- 1 file changed, 19 insertions(+), 4 deletions(-)
-
-diff --git a/usr/iscsid.c b/usr/iscsid.c
-index b4bb65b..c0ea6fa 100644
---- a/usr/iscsid.c
-+++ b/usr/iscsid.c
-@@ -27,6 +27,7 @@
- #include <unistd.h>
- #include <string.h>
- #include <signal.h>
-+#include <grp.h>
- #include <sys/mman.h>
- #include <sys/utsname.h>
- #include <sys/types.h>
-@@ -477,11 +478,25 @@ int main(int argc, char *argv[])
-               }
-       }
--      if (uid && setuid(uid) < 0)
--              perror("setuid\n");
-+      if (gid && setgid(gid) < 0) {
-+              log_error("Unable to setgid to %d\n", gid);
-+              log_close(log_pid);
-+              exit(ISCSI_ERR);
-+      }
--      if (gid && setgid(gid) < 0)
--              perror("setgid\n");
-+      if ((geteuid() == 0) && (getgroups(0, NULL))) {
-+              if (setgroups(0, NULL) != 0) {
-+                      log_error("Unable to drop supplementary group ids\n");
-+                      log_close(log_pid);
-+                      exit(ISCSI_ERR);
-+              }
-+      }
-+
-+      if (uid && setuid(uid) < 0) {
-+              log_error("Unable to setuid to %d\n", uid);
-+              log_close(log_pid);
-+              exit(ISCSI_ERR);
-+      }
-       memset(&daemon_config, 0, sizeof (daemon_config));
-       daemon_config.pid_file = pid_file;
--- 
-1.8.1.4
-
diff --git a/iscsi-initiator-utils/patches/0099-use-Red-Hat-version-string-to-match-RPM-package-vers.patch b/iscsi-initiator-utils/patches/0099-use-Red-Hat-version-string-to-match-RPM-package-vers.patch
deleted file mode 100644 (file)
index 3c219bc..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From 1483a176fdbb22bbfecf06eea57d1aa200f30561 Mon Sep 17 00:00:00 2001
-From: Chris Leech <cleech@redhat.com>
-Date: Mon, 21 Jan 2013 15:43:36 -0800
-Subject: use Red Hat version string to match RPM package version
-
----
- usr/version.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/usr/version.h b/usr/version.h
-index a090522..aef0c3d 100644
---- a/usr/version.h
-+++ b/usr/version.h
-@@ -6,7 +6,7 @@
-  * This may not be the same value as the kernel versions because
-  * some other maintainer could merge a patch without going through us
-  */
--#define ISCSI_VERSION_STR     "2.0-873"
-+#define ISCSI_VERSION_STR     "6.2.0.873-1"
- #define ISCSI_VERSION_FILE    "/sys/module/scsi_transport_iscsi/version"
- #endif
--- 
-1.7.11.7
-
diff --git a/iscsi-initiator-utils/systemd/iscsi.service b/iscsi-initiator-utils/systemd/iscsi.service
deleted file mode 100644 (file)
index faacc03..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-[Unit]
-Description=Login and scanning of iSCSI devices
-Documentation=man:iscsid(8) man:iscsiadm(8)
-DefaultDependencies=no
-Conflicts=shutdown.target
-After=systemd-remount-fs.service network.target iscsid.service
-Before=remote-fs-pre.target
-ConditionPathExists=/etc/iscsi/initiatorname.iscsi
-
-[Service]
-Type=oneshot
-RemainAfterExit=true
-ExecStart=/usr/lib/iscsi_mark_root_nodes
-ExecStart=/sbin/iscsiadm -m node --loginall=automatic
-ExecStop=/bin/sync
-ExecStop=/sbin/iscsiadm -m node --logoutall=automatic
-
-[Install]
-WantedBy=sysinit.target
diff --git a/iscsi-initiator-utils/systemd/iscsid.service b/iscsi-initiator-utils/systemd/iscsid.service
deleted file mode 100644 (file)
index 045fd34..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-[Unit]
-Description=Open-iSCSI
-Documentation=man:iscsid(8) man:iscsiadm(8)
-DefaultDependencies=no
-Conflicts=shutdown.target
-After=network.target
-Before=remote-fs-pre.target
-
-[Service]
-Type=forking
-PIDFile=/var/run/iscsid.pid
-ExecStart=/usr/sbin/iscsid
-ExecStop=/sbin/iscsiadm -k 0 2
-
-[Install]
-WantedBy=multi-user.target
diff --git a/iscsi-initiator-utils/systemd/iscsid.socket b/iscsi-initiator-utils/systemd/iscsid.socket
deleted file mode 100644 (file)
index 58a8d12..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-[Unit]
-Description=Open-iSCSI iscsid Socket
-Documentation=man:iscsid(8) man:iscsiadm(8)
-
-[Socket]
-ListenStream=@ISCSIADM_ABSTRACT_NAMESPACE
-
-[Install]
-WantedBy=sockets.target