diff mbox

[rfc,4/4] iscsi-target: use generic inet_pton_with_scope

Message ID 1487267017-29904-5-git-send-email-sagi@grimberg.me (mailing list archive)
State Not Applicable
Headers show

Commit Message

Sagi Grimberg Feb. 16, 2017, 5:43 p.m. UTC
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
---
 drivers/target/iscsi/iscsi_target_configfs.c | 46 ++++++++--------------------
 1 file changed, 12 insertions(+), 34 deletions(-)

Comments

Nicholas A. Bellinger Feb. 19, 2017, 5:54 a.m. UTC | #1
On Thu, 2017-02-16 at 19:43 +0200, Sagi Grimberg wrote:
> Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
> ---
>  drivers/target/iscsi/iscsi_target_configfs.c | 46 ++++++++--------------------
>  1 file changed, 12 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c
> index bf40f03755dd..f30c27b83c5e 100644
> --- a/drivers/target/iscsi/iscsi_target_configfs.c
> +++ b/drivers/target/iscsi/iscsi_target_configfs.c
> @@ -167,10 +167,7 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
>  	struct iscsi_portal_group *tpg;
>  	struct iscsi_tpg_np *tpg_np;
>  	char *str, *str2, *ip_str, *port_str;
> -	struct sockaddr_storage sockaddr;
> -	struct sockaddr_in *sock_in;
> -	struct sockaddr_in6 *sock_in6;
> -	unsigned long port;
> +	struct sockaddr_storage sockaddr = { };
>  	int ret;
>  	char buf[MAX_PORTAL_LEN + 1];
>  
> @@ -182,21 +179,19 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
>  	memset(buf, 0, MAX_PORTAL_LEN + 1);
>  	snprintf(buf, MAX_PORTAL_LEN + 1, "%s", name);
>  
> -	memset(&sockaddr, 0, sizeof(struct sockaddr_storage));
> -
>  	str = strstr(buf, "[");
>  	if (str) {
> -		const char *end;
> -
>  		str2 = strstr(str, "]");
>  		if (!str2) {
>  			pr_err("Unable to locate trailing \"]\""
>  				" in IPv6 iSCSI network portal address\n");
>  			return ERR_PTR(-EINVAL);
>  		}
> -		str++; /* Skip over leading "[" */
> +
> +		ip_str = str + 1; /* Skip over leading "[" */
>  		*str2 = '\0'; /* Terminate the unbracketed IPv6 address */
>  		str2++; /* Skip over the \0 */
> +
>  		port_str = strstr(str2, ":");
>  		if (!port_str) {
>  			pr_err("Unable to locate \":port\""
> @@ -205,23 +200,8 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
>  		}
>  		*port_str = '\0'; /* Terminate string for IP */
>  		port_str++; /* Skip over ":" */
> -
> -		ret = kstrtoul(port_str, 0, &port);
> -		if (ret < 0) {
> -			pr_err("kstrtoul() failed for port_str: %d\n", ret);
> -			return ERR_PTR(ret);
> -		}
> -		sock_in6 = (struct sockaddr_in6 *)&sockaddr;
> -		sock_in6->sin6_family = AF_INET6;
> -		sock_in6->sin6_port = htons((unsigned short)port);
> -		ret = in6_pton(str, -1,
> -				(void *)&sock_in6->sin6_addr.in6_u, -1, &end);
> -		if (ret <= 0) {
> -			pr_err("in6_pton returned: %d\n", ret);
> -			return ERR_PTR(-EINVAL);
> -		}
>  	} else {
> -		str = ip_str = &buf[0];
> +		ip_str = &buf[0];
>  		port_str = strstr(ip_str, ":");
>  		if (!port_str) {
>  			pr_err("Unable to locate \":port\""
> @@ -230,17 +210,15 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
>  		}
>  		*port_str = '\0'; /* Terminate string for IP */
>  		port_str++; /* Skip over ":" */
> +	}
>  
> -		ret = kstrtoul(port_str, 0, &port);
> -		if (ret < 0) {
> -			pr_err("kstrtoul() failed for port_str: %d\n", ret);
> -			return ERR_PTR(ret);
> -		}
> -		sock_in = (struct sockaddr_in *)&sockaddr;
> -		sock_in->sin_family = AF_INET;
> -		sock_in->sin_port = htons((unsigned short)port);
> -		sock_in->sin_addr.s_addr = in_aton(ip_str);
> +	ret = inet_pton_with_scope(&init_net, AF_UNSPEC, ip_str,
> +			port_str, &sockaddr);
> +	if (ret) {
> +		pr_err("malformed ip/port passed: %s\n", name);
> +		return ERR_PTR(ret);
>  	}
> +
>  	tpg = container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg);
>  	ret = iscsit_get_tpg(tpg);
>  	if (ret < 0)

A nice cleanup.

Acked-by: Nicholas Bellinger <nab@linux-iscsi.org>

--
To unsubscribe from this list: send the line "unsubscribe target-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c
index bf40f03755dd..f30c27b83c5e 100644
--- a/drivers/target/iscsi/iscsi_target_configfs.c
+++ b/drivers/target/iscsi/iscsi_target_configfs.c
@@ -167,10 +167,7 @@  static struct se_tpg_np *lio_target_call_addnptotpg(
 	struct iscsi_portal_group *tpg;
 	struct iscsi_tpg_np *tpg_np;
 	char *str, *str2, *ip_str, *port_str;
-	struct sockaddr_storage sockaddr;
-	struct sockaddr_in *sock_in;
-	struct sockaddr_in6 *sock_in6;
-	unsigned long port;
+	struct sockaddr_storage sockaddr = { };
 	int ret;
 	char buf[MAX_PORTAL_LEN + 1];
 
@@ -182,21 +179,19 @@  static struct se_tpg_np *lio_target_call_addnptotpg(
 	memset(buf, 0, MAX_PORTAL_LEN + 1);
 	snprintf(buf, MAX_PORTAL_LEN + 1, "%s", name);
 
-	memset(&sockaddr, 0, sizeof(struct sockaddr_storage));
-
 	str = strstr(buf, "[");
 	if (str) {
-		const char *end;
-
 		str2 = strstr(str, "]");
 		if (!str2) {
 			pr_err("Unable to locate trailing \"]\""
 				" in IPv6 iSCSI network portal address\n");
 			return ERR_PTR(-EINVAL);
 		}
-		str++; /* Skip over leading "[" */
+
+		ip_str = str + 1; /* Skip over leading "[" */
 		*str2 = '\0'; /* Terminate the unbracketed IPv6 address */
 		str2++; /* Skip over the \0 */
+
 		port_str = strstr(str2, ":");
 		if (!port_str) {
 			pr_err("Unable to locate \":port\""
@@ -205,23 +200,8 @@  static struct se_tpg_np *lio_target_call_addnptotpg(
 		}
 		*port_str = '\0'; /* Terminate string for IP */
 		port_str++; /* Skip over ":" */
-
-		ret = kstrtoul(port_str, 0, &port);
-		if (ret < 0) {
-			pr_err("kstrtoul() failed for port_str: %d\n", ret);
-			return ERR_PTR(ret);
-		}
-		sock_in6 = (struct sockaddr_in6 *)&sockaddr;
-		sock_in6->sin6_family = AF_INET6;
-		sock_in6->sin6_port = htons((unsigned short)port);
-		ret = in6_pton(str, -1,
-				(void *)&sock_in6->sin6_addr.in6_u, -1, &end);
-		if (ret <= 0) {
-			pr_err("in6_pton returned: %d\n", ret);
-			return ERR_PTR(-EINVAL);
-		}
 	} else {
-		str = ip_str = &buf[0];
+		ip_str = &buf[0];
 		port_str = strstr(ip_str, ":");
 		if (!port_str) {
 			pr_err("Unable to locate \":port\""
@@ -230,17 +210,15 @@  static struct se_tpg_np *lio_target_call_addnptotpg(
 		}
 		*port_str = '\0'; /* Terminate string for IP */
 		port_str++; /* Skip over ":" */
+	}
 
-		ret = kstrtoul(port_str, 0, &port);
-		if (ret < 0) {
-			pr_err("kstrtoul() failed for port_str: %d\n", ret);
-			return ERR_PTR(ret);
-		}
-		sock_in = (struct sockaddr_in *)&sockaddr;
-		sock_in->sin_family = AF_INET;
-		sock_in->sin_port = htons((unsigned short)port);
-		sock_in->sin_addr.s_addr = in_aton(ip_str);
+	ret = inet_pton_with_scope(&init_net, AF_UNSPEC, ip_str,
+			port_str, &sockaddr);
+	if (ret) {
+		pr_err("malformed ip/port passed: %s\n", name);
+		return ERR_PTR(ret);
 	}
+
 	tpg = container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg);
 	ret = iscsit_get_tpg(tpg);
 	if (ret < 0)