Mercurial > illumos > illumos-gate
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++;