changeset 12641:0d09c6ce3fde

6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
author Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
date Thu, 17 Jun 2010 16:08:46 -0400
parents b4f09d1fd79d
children 3d43062bca80
files usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c
diffstat 1 files changed, 21 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c	Thu Jun 17 10:26:59 2010 -0400
+++ b/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c	Thu Jun 17 16:08:46 2010 -0400
@@ -1808,8 +1808,11 @@
 	int prefixlen = 0;
 	struct sockaddr_storage laddr;
 	struct sockaddr_storage mask;
+	struct sockaddr_in6 *sin6;
+	struct sockaddr_in *sin;
 	ipadm_status_t istatus;
 	char cidraddr[BUFSIZ];
+	char addrstr[INET6_ADDRSTRLEN];
 
 	(void) strncpy(name, origname, sizeof (name));
 
@@ -1839,7 +1842,6 @@
 		(void) memset(&mask, 0, sizeof (mask));
 		mask.ss_family = afp->af_af;
 		if (afp->af_af == AF_INET6) {
-			struct sockaddr_in6 *sin6;
 			sin6 = (struct sockaddr_in6 *)&mask;
 			if (!in_prefixlentomask(prefixlen, IPV6_ABITS,
 			    (uchar_t *)&sin6->sin6_addr)) {
@@ -1849,8 +1851,6 @@
 				exit(1);
 			}
 		} else {
-			struct sockaddr_in *sin;
-
 			sin = (struct sockaddr_in *)&mask;
 			if (!in_prefixlentomask(prefixlen, IP_ABITS,
 			    (uchar_t *)&sin->sin_addr)) {
@@ -1907,17 +1907,25 @@
 		if (istatus != IPADM_SUCCESS)
 			ipadmerr_exit(istatus, "addif");
 
-		if (strchr(str, '/') == NULL) {
-			/*
-			 * lifr.lifr_addr, which is updated by set_mask_lifreq()
-			 * will contain the right mask to use.
-			 */
-			prefixlen = mask2plen(&lifr.lifr_addr);
-			(void) snprintf(cidraddr, sizeof (cidraddr), "%s/%d",
-			    str, prefixlen);
-			str = cidraddr;
+		if (af == AF_INET) {
+			sin = (struct sockaddr_in *)&laddr;
+			(void) inet_ntop(AF_INET, &sin->sin_addr, addrstr,
+			    sizeof (addrstr));
+		} else {
+			sin6 = (struct sockaddr_in6 *)&laddr;
+			(void) inet_ntop(AF_INET6, &sin6->sin6_addr, addrstr,
+			    sizeof (addrstr));
 		}
-		istatus = ipadm_set_addr(ipaddr, str, af);
+		/*
+		 * lifr.lifr_addr, which is updated by set_mask_lifreq()
+		 * will contain the right mask to use.
+		 */
+		prefixlen = mask2plen(&lifr.lifr_addr);
+		(void) snprintf(cidraddr, sizeof (cidraddr), "%s/%d",
+		    addrstr, prefixlen);
+
+		istatus = ipadm_set_addr(ipaddr, cidraddr, af);
+
 		if (istatus != IPADM_SUCCESS)
 			ipadmerr_exit(istatus, "could not set address");
 		setaddr++;