diff options
author | Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM> | 2010-06-17 16:08:46 -0400 |
---|---|---|
committer | Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM> | 2010-06-17 16:08:46 -0400 |
commit | 3166459d34f9db4a7e8fac047d84b45ee4a7fb9f (patch) | |
tree | f64e13b6298b84bdcf378624c2658cd3db8a5991 /usr/src | |
parent | 80f5ed8169a6e7282d99231044035a818806371c (diff) | |
download | illumos-gate-3166459d34f9db4a7e8fac047d84b45ee4a7fb9f.tar.gz |
6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c b/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c index c511a2153e..b1409d8420 100644 --- a/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c +++ b/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c @@ -1808,8 +1808,11 @@ addif(char *str, int64_t param) 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 @@ addif(char *str, int64_t param) (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 @@ addif(char *str, int64_t param) 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 @@ addif(char *str, int64_t param) 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++; |