Deleted Added
full compact
26c26
< * $FreeBSD: head/usr.sbin/ppp/iface.c 78410 2001-06-18 14:59:36Z brian $
---
> * $FreeBSD: head/usr.sbin/ppp/iface.c 81634 2001-08-14 16:05:52Z brian $
33a34
> #include <net/if_var.h>
36a38
> #include <netinet/in_var.h>
37a40,42
> #ifndef NOINET6
> #include <netinet6/nd6.h>
> #endif
62a68,69
> #include "ncpaddr.h"
> #include "ip.h"
71a79,80
> #include "ipv6cp.h"
> #include "ncp.h"
77,93d85
< static int
< bitsinmask(struct in_addr mask)
< {
< u_int32_t bitmask, maskaddr;
< int bits;
<
< bitmask = 0xffffffff;
< maskaddr = ntohl(mask.s_addr);
< for (bits = 32; bits >= 0; bits--) {
< if (maskaddr == bitmask)
< break;
< bitmask &= ~(1 << (32 - bits));
< }
<
< return bits;
< }
<
97c89
< int mib[6], s, maxtries, err;
---
> int mib[6], maxtries, err;
107,112d98
< s = socket(AF_INET, SOCK_DGRAM, 0);
< if (s < 0) {
< fprintf(stderr, "iface_Create: socket(): %s\n", strerror(errno));
< return NULL;
< }
<
125d110
< close(s);
132d116
< close(s);
138d121
< close(s);
169,170c152,153
< iface->in_addrs = 0;
< iface->in_addr = NULL;
---
> iface->addrs = 0;
> iface->addr = NULL;
183c166,170
< if (sa[RTAX_IFA] && sa[RTAX_IFA]->sa_family == AF_INET) {
---
> if (sa[RTAX_IFA] && (sa[RTAX_IFA]->sa_family == AF_INET
> #ifndef NOINET6
> || sa[RTAX_IFA]->sa_family == AF_INET6
> #endif
> )) {
186,187c173,174
< addr = (struct iface_addr *)realloc
< (iface->in_addr, (iface->in_addrs + 1) * sizeof iface->in_addr[0]);
---
> addr = (struct iface_addr *)
> realloc(iface->addr, (iface->addrs + 1) * sizeof iface->addr[0]);
190c177
< iface->in_addr = addr;
---
> iface->addr = addr;
192,193c179,180
< addr += iface->in_addrs;
< iface->in_addrs++;
---
> addr += iface->addrs;
> iface->addrs++;
195,196c182
< addr->ifa = ((struct sockaddr_in *)sa[RTAX_IFA])->sin_addr;
<
---
> ncprange_setsa(&addr->ifa, sa[RTAX_IFA], sa[RTAX_NETMASK]);
198c184
< addr->brd = ((struct sockaddr_in *)sa[RTAX_BRD])->sin_addr;
---
> ncpaddr_setsa(&addr->peer, sa[RTAX_BRD]);
200,207c186
< addr->brd.s_addr = INADDR_ANY;
<
< if (sa[RTAX_NETMASK])
< addr->mask = ((struct sockaddr_in *)sa[RTAX_NETMASK])->sin_addr;
< else
< addr->mask.s_addr = INADDR_ANY;
<
< addr->bits = bitsinmask(addr->mask);
---
> ncpaddr_init(&addr->peer);
214d192
< close(s);
218a197,274
> static int
> iface_addr_Zap(const char *name, struct iface_addr *addr, int s)
> {
> struct ifaliasreq ifra;
> #ifndef NOINET6
> struct in6_aliasreq ifra6;
> #endif
> struct sockaddr_in *me4, *msk4, *peer4;
> struct sockaddr_storage ssme, sspeer, ssmsk;
> int res;
>
> ncprange_getsa(&addr->ifa, &ssme, &ssmsk);
> ncpaddr_getsa(&addr->peer, &sspeer);
> res = 0;
>
> switch (ncprange_family(&addr->ifa)) {
> case AF_INET:
> memset(&ifra, '\0', sizeof ifra);
> strncpy(ifra.ifra_name, name, sizeof ifra.ifra_name - 1);
>
> me4 = (struct sockaddr_in *)&ifra.ifra_addr;
> memcpy(me4, &ssme, sizeof *me4);
>
> msk4 = (struct sockaddr_in *)&ifra.ifra_mask;
> memcpy(msk4, &ssmsk, sizeof *msk4);
>
> peer4 = (struct sockaddr_in *)&ifra.ifra_broadaddr;
> if (ncpaddr_family(&addr->peer) == AF_UNSPEC) {
> peer4->sin_family = AF_INET;
> peer4->sin_len = sizeof(*peer4);
> peer4->sin_addr.s_addr = INADDR_NONE;
> } else
> memcpy(peer4, &sspeer, sizeof *peer4);
>
> res = ID0ioctl(s, SIOCDIFADDR, &ifra);
> break;
>
> #ifndef NOINET6
> case AF_INET6:
> memset(&ifra6, '\0', sizeof ifra6);
> strncpy(ifra6.ifra_name, name, sizeof ifra6.ifra_name - 1);
>
> memcpy(&ifra6.ifra_addr, &ssme, sizeof ifra6.ifra_addr);
> memcpy(&ifra6.ifra_prefixmask, &ssmsk, sizeof ifra6.ifra_prefixmask);
> ifra6.ifra_prefixmask.sin6_family = AF_UNSPEC;
> if (ncpaddr_family(&addr->peer) == AF_UNSPEC)
> ifra6.ifra_dstaddr.sin6_family = AF_UNSPEC;
> else
> memcpy(&ifra6.ifra_dstaddr, &sspeer, sizeof ifra6.ifra_dstaddr);
> ifra6.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME;
> ifra6.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;
>
> res = ID0ioctl(s, SIOCDIFADDR_IN6, &ifra6);
> break;
> #endif
> }
>
> if (res == -1) {
> char dst[40];
> const char *end =
> #ifndef NOINET6
> ncprange_family(&addr->ifa) == AF_INET6 ? "_IN6" :
> #endif
> "";
>
> if (ncpaddr_family(&addr->peer) == AF_UNSPEC)
> log_Printf(LogWARN, "iface rm: ioctl(SIOCDIFADDR%s, %s): %s\n",
> end, ncprange_ntoa(&addr->ifa), strerror(errno));
> else {
> snprintf(dst, sizeof dst, "%s", ncpaddr_ntoa(&addr->peer));
> log_Printf(LogWARN, "iface rm: ioctl(SIOCDIFADDR%s, %s -> %s): %s\n",
> end, ncprange_ntoa(&addr->ifa), dst, strerror(errno));
> }
> }
>
> return res != -1;
> }
>
220c276
< iface_addr_Zap(const char *name, struct iface_addr *addr)
---
> iface_addr_Add(const char *name, struct iface_addr *addr, int s)
223,224c279,284
< struct sockaddr_in *me, *peer;
< int s;
---
> #ifndef NOINET6
> struct in6_aliasreq ifra6;
> #endif
> struct sockaddr_in *me4, *msk4, *peer4;
> struct sockaddr_storage ssme, sspeer, ssmsk;
> int res;
226,229c286,291
< s = ID0socket(AF_INET, SOCK_DGRAM, 0);
< if (s < 0)
< log_Printf(LogERROR, "iface_addr_Zap: socket(): %s\n", strerror(errno));
< else {
---
> ncprange_getsa(&addr->ifa, &ssme, &ssmsk);
> ncpaddr_getsa(&addr->peer, &sspeer);
> res = 0;
>
> switch (ncprange_family(&addr->ifa)) {
> case AF_INET:
232,242c294,328
< me = (struct sockaddr_in *)&ifra.ifra_addr;
< peer = (struct sockaddr_in *)&ifra.ifra_broadaddr;
< me->sin_family = peer->sin_family = AF_INET;
< me->sin_len = peer->sin_len = sizeof(struct sockaddr_in);
< me->sin_addr = addr->ifa;
< peer->sin_addr = addr->brd;
< log_Printf(LogDEBUG, "Delete %s\n", inet_ntoa(addr->ifa));
< if (ID0ioctl(s, SIOCDIFADDR, &ifra) < 0)
< log_Printf(LogWARN, "iface_addr_Zap: ioctl(SIOCDIFADDR, %s): %s\n",
< inet_ntoa(addr->ifa), strerror(errno));
< close(s);
---
>
> me4 = (struct sockaddr_in *)&ifra.ifra_addr;
> memcpy(me4, &ssme, sizeof *me4);
>
> msk4 = (struct sockaddr_in *)&ifra.ifra_mask;
> memcpy(msk4, &ssmsk, sizeof *msk4);
>
> peer4 = (struct sockaddr_in *)&ifra.ifra_broadaddr;
> if (ncpaddr_family(&addr->peer) == AF_UNSPEC) {
> peer4->sin_family = AF_INET;
> peer4->sin_len = sizeof(*peer4);
> peer4->sin_addr.s_addr = INADDR_NONE;
> } else
> memcpy(peer4, &sspeer, sizeof *peer4);
>
> res = ID0ioctl(s, SIOCAIFADDR, &ifra);
> break;
>
> #ifndef NOINET6
> case AF_INET6:
> memset(&ifra6, '\0', sizeof ifra6);
> strncpy(ifra6.ifra_name, name, sizeof ifra6.ifra_name - 1);
>
> memcpy(&ifra6.ifra_addr, &ssme, sizeof ifra6.ifra_addr);
> memcpy(&ifra6.ifra_prefixmask, &ssmsk, sizeof ifra6.ifra_prefixmask);
> if (ncpaddr_family(&addr->peer) == AF_UNSPEC)
> ifra6.ifra_dstaddr.sin6_family = AF_UNSPEC;
> else
> memcpy(&ifra6.ifra_dstaddr, &sspeer, sizeof ifra6.ifra_dstaddr);
> ifra6.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME;
> ifra6.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;
>
> res = ID0ioctl(s, SIOCAIFADDR_IN6, &ifra6);
> break;
> #endif
243a330,347
>
> if (res == -1) {
> char dst[40];
> const char *end =
> #ifndef NOINET6
> ncprange_family(&addr->ifa) == AF_INET6 ? "_IN6" :
> #endif
> "";
>
> if (ncpaddr_family(&addr->peer) == AF_UNSPEC)
> log_Printf(LogWARN, "iface add: ioctl(SIOCAIFADDR%s, %s): %s\n",
> end, ncprange_ntoa(&addr->ifa), strerror(errno));
> else {
> snprintf(dst, sizeof dst, "%s", ncpaddr_ntoa(&addr->peer));
> log_Printf(LogWARN, "iface add: ioctl(SIOCDIFADDR%s, %s -> %s): %s\n",
> end, ncprange_ntoa(&addr->ifa), dst, strerror(errno));
> }
> }
245a350
>
247c352
< iface_inClear(struct iface *iface, int how)
---
> iface_Clear(struct iface *iface, struct ncp *ncp, int family, int how)
249c354
< int n, addrs;
---
> int addrs, af, inskip, in6skip, n, s4 = -1, s6 = -1, *s;
251,254c356,358
< if (iface->in_addrs) {
< addrs = n = how == IFACE_CLEAR_ALL ? 0 : 1;
< for (; n < iface->in_addrs; n++)
< iface_addr_Zap(iface->name, iface->in_addr + n);
---
> if (iface->addrs) {
> inskip = in6skip = how == IFACE_CLEAR_ALL ? 0 : 1;
> addrs = 0;
256c360,396
< iface->in_addrs = addrs;
---
> for (n = 0; n < iface->addrs; n++) {
> af = ncprange_family(&iface->addr[n].ifa);
> if (family == 0 || family == af) {
> if (!iface->addr[n].system && (how & IFACE_SYSTEM))
> continue;
> switch (af) {
> case AF_INET:
> if (inskip) {
> inskip = 0;
> continue;
> }
> s = &s4;
> break;
>
> #ifndef NOINET6
> case AF_INET6:
> if (in6skip) {
> in6skip = 0;
> continue;
> }
> s = &s6;
> break;
> #endif
> }
>
> if (*s == -1 && (*s = ID0socket(af, SOCK_DGRAM, 0)) == -1)
> log_Printf(LogERROR, "iface_Clear: socket(): %s\n", strerror(errno));
> else if (iface_addr_Zap(iface->name, iface->addr + n, *s)) {
> ncp_IfaceAddrDeleted(ncp, iface->addr + n);
> bcopy(iface->addr + n + 1, iface->addr + n,
> (iface->addrs - n - 1) * sizeof *iface->addr);
> iface->addrs--;
> n--;
> }
> }
> }
>
257a398,402
>
> if (s4)
> close(s4);
> if (s6)
> close(s6);
262,263c407,408
< iface_inAdd(struct iface *iface, struct in_addr ifa, struct in_addr mask,
< struct in_addr brd, int how)
---
> iface_Add(struct iface *iface, struct ncp *ncp, const struct ncprange *ifa,
> const struct ncpaddr *peer, int how)
265,267c410,411
< int slot, s, chg, nochange;
< struct ifaliasreq ifra;
< struct sockaddr_in *me, *peer, *msk;
---
> int af, n, s, width;
> struct ncpaddr ifaddr, ncplocal;
270,282c414,416
< for (slot = 0; slot < iface->in_addrs; slot++)
< if (iface->in_addr[slot].ifa.s_addr == ifa.s_addr) {
< if (how & IFACE_FORCE_ADD)
< break;
< else
< /* errno = EEXIST; */
< return 0;
< }
<
< addr = (struct iface_addr *)realloc
< (iface->in_addr, (iface->in_addrs + 1) * sizeof iface->in_addr[0]);
< if (addr == NULL) {
< log_Printf(LogERROR, "iface_inAdd: realloc: %s\n", strerror(errno));
---
> af = ncprange_family(ifa);
> if ((s = ID0socket(af, SOCK_DGRAM, 0)) == -1) {
> log_Printf(LogERROR, "iface_Add: socket(): %s\n", strerror(errno));
285c419
< iface->in_addr = addr;
---
> ncprange_getaddr(ifa, &ncplocal);
287,313c421,425
< /*
< * We've gotta be careful here. If we try to add an address with the
< * same destination as an existing interface, nothing will work.
< * Instead, we tweak all previous address entries that match the
< * to-be-added destination to 255.255.255.255 (w/ a similar netmask).
< * There *may* be more than one - if the user has ``iface add''ed
< * stuff previously.
< */
< nochange = 0;
< s = -1;
< for (chg = 0; chg < iface->in_addrs; chg++) {
< if ((iface->in_addr[chg].brd.s_addr == brd.s_addr &&
< brd.s_addr != INADDR_BROADCAST) || chg == slot) {
< /*
< * If we've found an entry that exactly matches what we want to add,
< * don't remove it and then add it again. If we do, it's possible
< * that the kernel will (correctly) ``tidy up'' any routes that use
< * the IP number as a destination.
< */
< if (chg == slot && iface->in_addr[chg].mask.s_addr == mask.s_addr) {
< if (brd.s_addr == iface->in_addr[slot].brd.s_addr)
< nochange = 1;
< /*
< * If only the destination address has changed, the SIOCAIFADDR
< * we do after the current loop will change it.
< */
< continue;
---
> for (n = 0; n < iface->addrs; n++) {
> if (ncprange_contains(&iface->addr[n].ifa, &ncplocal)) {
> if (!(how & IFACE_FORCE_ADD)) {
> close(s);
> return 0; /* errno = EEXIST; */
315,317c427,431
< if (s == -1 && (s = ID0socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
< log_Printf(LogERROR, "iface_inAdd: socket(): %s\n", strerror(errno));
< return 0;
---
>
> if (ncprange_equal(&iface->addr[n].ifa, ifa) &&
> ncpaddr_equal(&iface->addr[n].peer, peer)) {
> close(s);
> return 1; /* Already there */
320,349c434,450
< memset(&ifra, '\0', sizeof ifra);
< strncpy(ifra.ifra_name, iface->name, sizeof ifra.ifra_name - 1);
< me = (struct sockaddr_in *)&ifra.ifra_addr;
< msk = (struct sockaddr_in *)&ifra.ifra_mask;
< peer = (struct sockaddr_in *)&ifra.ifra_broadaddr;
< me->sin_family = msk->sin_family = peer->sin_family = AF_INET;
< me->sin_len = msk->sin_len = peer->sin_len = sizeof(struct sockaddr_in);
< me->sin_addr = iface->in_addr[chg].ifa;
< msk->sin_addr = iface->in_addr[chg].mask;
< peer->sin_addr = iface->in_addr[chg].brd;
< log_Printf(LogDEBUG, "Delete %s\n", inet_ntoa(me->sin_addr));
< ID0ioctl(s, SIOCDIFADDR, &ifra); /* Don't care if it fails... */
< if (chg != slot) {
< peer->sin_addr.s_addr = iface->in_addr[chg].brd.s_addr =
< msk->sin_addr.s_addr = iface->in_addr[chg].mask.s_addr =
< INADDR_BROADCAST;
< iface->in_addr[chg].bits = 32;
< log_Printf(LogDEBUG, "Add %s -> 255.255.255.255\n",
< inet_ntoa(me->sin_addr));
< if (ID0ioctl(s, SIOCAIFADDR, &ifra) < 0 && errno != EEXIST) {
< /* Oops - that's bad(ish) news ! We've lost an alias ! */
< log_Printf(LogERROR, "iface_inAdd: ioctl(SIOCAIFADDR): %s: %s\n",
< inet_ntoa(me->sin_addr), strerror(errno));
< iface->in_addrs--;
< bcopy(iface->in_addr + chg + 1, iface->in_addr + chg,
< (iface->in_addrs - chg) * sizeof iface->in_addr[0]);
< if (slot > chg)
< slot--;
< chg--;
< }
---
> width =
> #ifndef NOINET6
> (af == AF_INET6) ? 128 :
> #endif
> 32;
> iface_addr_Zap(iface->name, iface->addr + n, s);
> ncprange_setwidth(&iface->addr[n].ifa, width);
> ncprange_getaddr(&iface->addr[n].ifa, &ifaddr);
> if (ncpaddr_equal(&ifaddr, &ncplocal))
> ncpaddr_copy(&iface->addr[n].peer, peer);
> else
> ncpaddr_init(&iface->addr[n].peer);
> iface_addr_Add(iface->name, iface->addr + n, s);
> if (ncpaddr_equal(&ifaddr, &ncplocal)) {
> close(s);
> ncp_IfaceAddrAdded(ncp, iface->addr + n);
> return 1;
354,386c455,460
< if (!nochange) {
< if (s == -1 && (s = ID0socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
< log_Printf(LogERROR, "iface_inAdd: socket(): %s\n", strerror(errno));
< return 0;
< }
< memset(&ifra, '\0', sizeof ifra);
< strncpy(ifra.ifra_name, iface->name, sizeof ifra.ifra_name - 1);
< me = (struct sockaddr_in *)&ifra.ifra_addr;
< msk = (struct sockaddr_in *)&ifra.ifra_mask;
< peer = (struct sockaddr_in *)&ifra.ifra_broadaddr;
< me->sin_family = msk->sin_family = peer->sin_family = AF_INET;
< me->sin_len = msk->sin_len = peer->sin_len = sizeof(struct sockaddr_in);
< me->sin_addr = ifa;
< msk->sin_addr = mask;
< peer->sin_addr = brd;
<
< if (log_IsKept(LogDEBUG)) {
< char buf[16];
<
< strncpy(buf, inet_ntoa(brd), sizeof buf-1);
< buf[sizeof buf - 1] = '\0';
< log_Printf(LogDEBUG, "Add %s -> %s\n", inet_ntoa(ifa), buf);
< }
<
< /* An EEXIST failure w/ brd == INADDR_BROADCAST is ok (and works!) */
< if (ID0ioctl(s, SIOCAIFADDR, &ifra) < 0 &&
< (brd.s_addr != INADDR_BROADCAST || errno != EEXIST)) {
< log_Printf(LogERROR, "iface_inAdd: ioctl(SIOCAIFADDR): %s: %s\n",
< inet_ntoa(ifa), strerror(errno));
< ID0ioctl(s, SIOCDIFADDR, &ifra); /* EEXIST ? */
< close(s);
< return 0;
< }
---
> addr = (struct iface_addr *)realloc
> (iface->addr, (iface->addrs + 1) * sizeof iface->addr[0]);
> if (addr == NULL) {
> log_Printf(LogERROR, "iface_inAdd: realloc: %s\n", strerror(errno));
> close(s);
> return 0;
387a462
> iface->addr = addr;
389,390c464,469
< if (s != -1)
< close(s);
---
> if (how & IFACE_ADD_FIRST) {
> /* Stuff it at the start of our list */
> n = 0;
> bcopy(iface->addr, iface->addr + 1, iface->addrs * sizeof *iface->addr);
> } else
> n = iface->addrs;
392,393c471,475
< if (slot == iface->in_addrs) {
< /* We're adding a new interface address */
---
> iface->addrs++;
> ncprange_copy(&iface->addr[n].ifa, ifa);
> ncpaddr_copy(&iface->addr[n].peer, peer);
> iface->addr[n].system = !!(how & IFACE_SYSTEM);
> iface_addr_Add(iface->name, iface->addr + n, s);
395,400c477,478
< if (how & IFACE_ADD_FIRST) {
< /* Stuff it at the start of our list */
< slot = 0;
< bcopy(iface->in_addr, iface->in_addr + 1,
< iface->in_addrs * sizeof iface->in_addr[0]);
< }
---
> close(s);
> ncp_IfaceAddrAdded(ncp, iface->addr + n);
402,413d479
< iface->in_addrs++;
< } else if (how & IFACE_ADD_FIRST) {
< /* Shift it up to the first slot */
< bcopy(iface->in_addr, iface->in_addr + 1, slot * sizeof iface->in_addr[0]);
< slot = 0;
< }
<
< iface->in_addr[slot].ifa = ifa;
< iface->in_addr[slot].mask = mask;
< iface->in_addr[slot].brd = brd;
< iface->in_addr[slot].bits = bitsinmask(iface->in_addr[slot].mask);
<
418c484
< iface_inDelete(struct iface *iface, struct in_addr ip)
---
> iface_Delete(struct iface *iface, struct ncp *ncp, const struct ncpaddr *del)
420c486,487
< int n;
---
> struct ncpaddr found;
> int n, res, s;
422,428c489,503
< for (n = 0; n < iface->in_addrs; n++)
< if (iface->in_addr[n].ifa.s_addr == ip.s_addr) {
< iface_addr_Zap(iface->name, iface->in_addr + n);
< bcopy(iface->in_addr + n + 1, iface->in_addr + n,
< (iface->in_addrs - n - 1) * sizeof iface->in_addr[0]);
< iface->in_addrs--;
< return 1;
---
> if ((s = ID0socket(ncpaddr_family(del), SOCK_DGRAM, 0)) == -1) {
> log_Printf(LogERROR, "iface_Delete: socket(): %s\n", strerror(errno));
> return 0;
> }
>
> for (n = res = 0; n < iface->addrs; n++) {
> ncprange_getaddr(&iface->addr[n].ifa, &found);
> if (ncpaddr_equal(&found, del)) {
> iface_addr_Zap(iface->name, iface->addr + n, s);
> ncp_IfaceAddrDeleted(ncp, iface->addr + n);
> bcopy(iface->addr + n + 1, iface->addr + n,
> (iface->addrs - n - 1) * sizeof *iface->addr);
> iface->addrs--;
> res = 1;
> break;
429a505
> }
431c507,509
< return 0;
---
> close(s);
>
> return res;
498c576
< free(iface->in_addr);
---
> free(iface->addr);
529a608
> struct ncpaddr ncpaddr;
531a611,614
> #ifndef NOINET6
> int scopeid, width;
> #endif
> struct in_addr mask;
545c628
< iface->in_addrs, iface->in_addrs == 1 ? "" : "es");
---
> iface->addrs, iface->addrs == 1 ? "" : "es");
547,558c630,655
< for (f = 0; f < iface->in_addrs; f++) {
< prompt_Printf(arg->prompt, " %s", inet_ntoa(iface->in_addr[f].ifa));
< if (iface->in_addr[f].bits >= 0)
< prompt_Printf(arg->prompt, "/%d", iface->in_addr[f].bits);
< if (iface->flags & IFF_POINTOPOINT)
< prompt_Printf(arg->prompt, " -> %s", inet_ntoa(iface->in_addr[f].brd));
< else if (iface->flags & IFF_BROADCAST)
< prompt_Printf(arg->prompt, " broadcast %s",
< inet_ntoa(iface->in_addr[f].brd));
< if (iface->in_addr[f].bits < 0)
< prompt_Printf(arg->prompt, " (mask %s)",
< inet_ntoa(iface->in_addr[f].mask));
---
> for (f = 0; f < iface->addrs; f++) {
> ncprange_getaddr(&iface->addr[f].ifa, &ncpaddr);
> switch (ncprange_family(&iface->addr[f].ifa)) {
> case AF_INET:
> prompt_Printf(arg->prompt, " inet %s --> ", ncpaddr_ntoa(&ncpaddr));
> if (ncpaddr_family(&iface->addr[f].peer) == AF_UNSPEC)
> prompt_Printf(arg->prompt, "255.255.255.255");
> else
> prompt_Printf(arg->prompt, "%s", ncpaddr_ntoa(&iface->addr[f].peer));
> ncprange_getip4mask(&iface->addr[f].ifa, &mask);
> prompt_Printf(arg->prompt, " netmask 0x%08lx", (long)ntohl(mask.s_addr));
> break;
>
> #ifndef NOINET6
> case AF_INET6:
> prompt_Printf(arg->prompt, " inet6 %s", ncpaddr_ntoa(&ncpaddr));
> if (ncpaddr_family(&iface->addr[f].peer) != AF_UNSPEC)
> prompt_Printf(arg->prompt, " --> %s",
> ncpaddr_ntoa(&iface->addr[f].peer));
> ncprange_getwidth(&iface->addr[f].ifa, &width);
> prompt_Printf(arg->prompt, " prefixlen %d", width);
> if ((scopeid = ncprange_scopeid(&iface->addr[f].ifa)) != -1)
> prompt_Printf(arg->prompt, " scopeid 0x%x", (unsigned)scopeid);
> break;
> #endif
> }