[PATCH 4/5] Call user defined callback progam from target_redirected()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Implement the calling of user defined callback.

Basically, the callback is called from target_redirected() to get 
redirect address, redirect port and redirect reason in 
"string_addr:string_port:string_reason" syntax.

example, ipv4: 10.0.0.41:860:Temporary

example, ipv6: [fe80::214:5eff:acaf:c844]:860:Temporary

Signed-Off-By: Chandra Seetharaman <sekharan@xxxxxxxxxx>
---
 usr/iscsi/target.c |   63 ++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 57 insertions(+), 6 deletions(-)

Index: tgt-1.0.8/usr/iscsi/target.c
===================================================================
--- tgt-1.0.8.orig/usr/iscsi/target.c
+++ tgt-1.0.8/usr/iscsi/target.c
@@ -188,6 +188,50 @@ int ip_acl(int tid, struct iscsi_connect
 	}
 	return -EPERM;
 }
+static int
+get_redirect_address(char *callback, char *buffer, int buflen,
+			char **address, char **ip_port, int *rsn)
+{
+	char *p, *addr, *port;
+
+	bzero(buffer, buflen);
+	if (call_program(callback, NULL, NULL, buffer, buflen, 0))
+		return -1;
+
+	/* syntax is string_addr:string_port:string_reason */
+	addr = p = buffer;
+	if (*p == '[') {
+		while (*p != ']' && *p != '\0')
+			p++;
+		if (*p == ']') {
+			p++;
+			if (*p != ':')
+				return -1;
+		}
+	} else {
+		while (*p != ':' && *p != '\0')
+			p++;
+	}
+	if (!*p)
+		return -1;
+	*p = '\0';
+	port = ++p;
+	while (*p != ':' && *p != '\0')
+		p++;
+	if (!*p)
+		return -1;
+	*p = '\0';
+	p++;
+	if (!strncmp(p, "Temporary", 9))
+		*rsn = ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP;
+	else if (!strncmp(p, "Permanent", 9))
+		*rsn = ISCSI_LOGIN_STATUS_TGT_MOVED_PERM;
+	else
+		return -1;
+	*address = addr;
+	*ip_port = port;
+	return 0;
+}
 
 int target_redirected(struct iscsi_target *target,
 	struct iscsi_connection *conn, char *buf, int *reason)
@@ -195,15 +239,22 @@ int target_redirected(struct iscsi_targe
 	struct sockaddr_storage from;
 	struct addrinfo hints, *res;
 	socklen_t len;
-	int ret, rsn;
+	int ret = 1, rsn;
 	char *p, *q, *str, *port, *addr;
+	char buffer[NI_MAXHOST + NI_MAXSERV + 4];
 
-	if (!strlen(target->redirect_info.addr))
-		return 0;
+	if (target->redirect_info.callback)
+		ret = get_redirect_address(target->redirect_info.callback,
+				buffer, sizeof(buffer), &addr, &port, &rsn);
 
-	addr = target->redirect_info.addr;
-	port = target->redirect_info.port;
-	rsn = target->redirect_info.reason;
+	if (ret) {
+		if (!strlen(target->redirect_info.addr))
+			return 0;
+
+		addr = target->redirect_info.addr;
+		port = target->redirect_info.port;
+		rsn = target->redirect_info.reason;
+	}
 
 	if (rsn != ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP &&
 	    rsn != ISCSI_LOGIN_STATUS_TGT_MOVED_PERM)
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux SCSI]     [Linux RAID]     [Linux Clusters]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]

  Powered by Linux