summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorVasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>2010-06-17 16:08:46 -0400
committerVasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>2010-06-17 16:08:46 -0400
commit3166459d34f9db4a7e8fac047d84b45ee4a7fb9f (patch)
treef64e13b6298b84bdcf378624c2658cd3db8a5991 /usr/src
parent80f5ed8169a6e7282d99231044035a818806371c (diff)
downloadillumos-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.c34
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++;