[stgt] [PATCH 5/5] Call user defined callback program with initiator info

Chandra Seetharaman sekharan at us.ibm.com
Tue Sep 21 03:41:21 CEST 2010


Add argument passing to callback.

Callback program is called with target name and ipv4 or ipv6 address.

If the callback program is /usr/local/bin/redirect, it is called as under:

example, ipv4: /usr/local/bin/redirect targetname 10.0.0.1

example, ipv6: /usr/local/bin/redirect targetname fe80::214:5eff:ef3b:c600

Signed-Off-By: Chandra Seetharaman <sekharan at us.ibm.com>
---
 usr/iscsi/target.c |   30 +++++++++++++++++++++---------
 1 file changed, 21 insertions(+), 9 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
@@ -239,14 +239,31 @@ int target_redirected(struct iscsi_targe
 	struct sockaddr_storage from;
 	struct addrinfo hints, *res;
 	socklen_t len;
-	int ret = 1, rsn;
+	int ret, rsn;
 	char *p, *q, *str, *port, *addr;
 	char buffer[NI_MAXHOST + NI_MAXSERV + 4];
+	char dst[INET6_ADDRSTRLEN], in_buf[1024];
 
-	if (target->redirect_info.callback)
-		ret = get_redirect_address(target->redirect_info.callback,
-				buffer, sizeof(buffer), &addr, &port, &rsn);
+	len = sizeof(from);
+	ret = conn->tp->ep_getpeername(conn, (struct sockaddr *)&from, &len);
+	if (ret < 0)
+		return 0;
 
+	ret = 1;
+	if (target->redirect_info.callback) {
+		p = in_buf;
+		p += sprintf(p, "%s ", target->redirect_info.callback);
+		p += sprintf(p, "%s ", tgt_targetname(target->tid));
+		ret = getnameinfo((struct sockaddr *)&from, sizeof(from), dst,
+				sizeof(dst), NULL, 0, NI_NUMERICHOST);
+		if (ret)
+			goto predefined;
+		sprintf(p, "%s", dst);
+		ret = get_redirect_address(in_buf, buffer,
+					sizeof(buffer), &addr, &port, &rsn);
+	}
+
+predefined:
 	if (ret) {
 		if (!strlen(target->redirect_info.addr))
 			return 0;
@@ -260,11 +277,6 @@ int target_redirected(struct iscsi_targe
 	    rsn != ISCSI_LOGIN_STATUS_TGT_MOVED_PERM)
 		return 0;
 
-	len = sizeof(from);
-	ret = conn->tp->ep_getpeername(conn, (struct sockaddr *)&from, &len);
-	if (ret < 0)
-		return 0;
-
 	p = strdup(addr);
 	if (!p)
 		return 0;
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list