9a1c94a
From e061cba1b91650ab08ae8fa50e8cadb13ac3d97d Mon Sep 17 00:00:00 2001
9a1c94a
From: Ronnie Sahlberg <ronniesahlberg@gmail.com>
9a1c94a
Date: Sun, 16 Jun 2013 11:35:14 -0700
9a1c94a
Subject: [PATCH] URL encoded Targetnames
9a1c94a
9a1c94a
Assume target names are URL encoded with '%' as the special character.
9a1c94a
9a1c94a
Any sequence of '%' followed by two bytes in the target name will be replaced
9a1c94a
with the byte that the second two bytes represent in hexadecimal.
9a1c94a
9a1c94a
Example
9a1c94a
iqn.ronnie.test%3A1234
9a1c94a
will be translated to iqn.ronnie.test:1234
9a1c94a
---
9a1c94a
 include/iscsi.h |  12 ++++--
9a1c94a
 lib/init.c      | 114 +++++++++++++++++++++++++++++++++++++++-----------------
9a1c94a
 lib/login.c     |   1 +
9a1c94a
 3 files changed, 88 insertions(+), 39 deletions(-)
9a1c94a
9a1c94a
diff --git a/include/iscsi.h b/include/iscsi.h
9a1c94a
index f14d404..a4ed932 100644
9a1c94a
--- a/include/iscsi.h
9a1c94a
+++ b/include/iscsi.h
9a1c94a
@@ -125,6 +125,10 @@ iscsi_set_initial_r2t(struct iscsi_context *iscsi, enum iscsi_initial_r2t initia
9a1c94a
  * iSCSI URL format :
9a1c94a
  * iscsi://[<username>[%<password>]@]<host>[:<port>]/<target-iqn>/<lun>
9a1c94a
  *
9a1c94a
+ * Target names are url encoded with '%' as a special character.
9a1c94a
+ * Example:
9a1c94a
+ * "iqn.ronnie.test%3A1234" will be translated to "iqn.ronnie.test:1234"
9a1c94a
+ *
9a1c94a
  * Function will return a pointer to an iscsi url structure if successful,
9a1c94a
  * or it will return NULL and set iscsi_get_error() accrodingly if there was a problem
9a1c94a
  * with the URL.
9a1c94a
diff --git a/lib/init.c b/lib/init.c
9a1c94a
index 18f3fb2..60a1b6d 100644
9a1c94a
--- a/lib/init.c
9a1c94a
+++ b/lib/init.c
9a1c94a
@@ -358,6 +358,45 @@ iscsi_is_logged_in(struct iscsi_context *iscsi)
9a1c94a
 	return iscsi->is_loggedin;
9a1c94a
 }
9a1c94a
 
9a1c94a
+static int
9a1c94a
+h2i(int h)
9a1c94a
+{
9a1c94a
+	if (h >= 'a' && h <= 'f') {
9a1c94a
+		return h - 'a' + 10;
9a1c94a
+	}
9a1c94a
+	if (h >= 'A' && h <= 'F') {
9a1c94a
+		return h - 'A' + 10;
9a1c94a
+	}
9a1c94a
+	return h - '0';
9a1c94a
+}
9a1c94a
+
9a1c94a
+static void
9a1c94a
+iscsi_decode_url_string(char *str)
9a1c94a
+{
9a1c94a
+	while (*str) {
9a1c94a
+		char *tmp = str;
9a1c94a
+		char c;
9a1c94a
+
9a1c94a
+		if (*str++ != '%') {
9a1c94a
+			continue;
9a1c94a
+		}
9a1c94a
+
9a1c94a
+		if (*str == 0) {
9a1c94a
+			return;
9a1c94a
+		}
9a1c94a
+		c = h2i(*str++) << 4;
9a1c94a
+
9a1c94a
+		if (*str == 0) {
9a1c94a
+			return;
9a1c94a
+		}
9a1c94a
+		c |= h2i(*str++);
9a1c94a
+
9a1c94a
+		*tmp++ = c;
9a1c94a
+		memmove(tmp, str, strlen(str));
9a1c94a
+		tmp[strlen(str)] = 0;
9a1c94a
+	}
9a1c94a
+}
9a1c94a
+
9a1c94a
 struct iscsi_url *
9a1c94a
 iscsi_parse_url(struct iscsi_context *iscsi, const char *url, int full)
9a1c94a
 {
9a1c94a
@@ -464,6 +506,8 @@ iscsi_parse_url(struct iscsi_context *iscsi, const char *url, int full)
9a1c94a
 		iscsi_url->lun = l;
9a1c94a
 	}
9a1c94a
 
9a1c94a
+	iscsi_decode_url_string(&iscsi_url->target[0]);
9a1c94a
+
9a1c94a
 	return iscsi_url;
9a1c94a
 }
9a1c94a
 
9a1c94a
-- 
9a1c94a
1.8.1.4
9a1c94a