Add argument passing to callback. Callback program is called with target name and ipv4 or ipv6 address (as unsigned int parameters). For ipv4, initiator address from sin_addr.s_addr is sent as an unsigned int argument. For example, when 10.0.0.1 is the initiator, the callback program "/usr/local/bin/redirect" is called as /usr/local/bin/redirect targetname 16777226 For ipv6, sin6_addr->s6_addr32[0] thru sin6_addr->s6_addr32[3] are sent as four unisgned int arguments, as in /usr/local/bin/redirect targetname 12345 98765 12233 34535 Signed-Off-By: Chandra Seetharaman <sekharan at us.ibm.com> --- usr/iscsi/target.c | 25 +++++++++++++++++++------ 1 file changed, 19 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 @@ -197,9 +197,27 @@ int target_redirected(struct iscsi_targe socklen_t len; int ret, rsn; char *p, *q, *str, *port, *addr; - char buffer[NI_MAXHOST + NI_MAXSERV + 4]; + char buffer[NI_MAXHOST + NI_MAXSERV + 4], in_buf[1024]; + + len = sizeof(from); + ret = conn->tp->ep_getpeername(conn, (struct sockaddr *)&from, &len); + if (ret < 0) + return 0; if (target->redirect_info.callback) { + p = in_buf; + p += sprintf(p, "%s ", target->redirect_info.callback); + p += sprintf(p, "%s ", tgt_targetname(target->tid)); + if (((struct sockaddr *)&from)->sa_family == AF_INET) + sprintf(p, " %u", (((struct sockaddr_in *) + &from)->sin_addr.s_addr)); + else { + struct in6_addr *a1 = &((struct sockaddr_in6 *) + &from)->sin6_addr; + sprintf(p, " %u %u %u %u", a1->s6_addr32[0], + a1->s6_addr32[1], a1->s6_addr32[2], + a1->s6_addr32[3]); + } bzero(buffer, NI_MAXHOST + NI_MAXSERV + 4); ret = call_program(target->redirect_info.callback, NULL, NULL, buffer, NI_MAXHOST + NI_MAXSERV + 4, 0); @@ -241,11 +259,6 @@ process: 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 |