Changeset 718dc95 in rtems


Ignore:
Timestamp:
Sep 21, 1998, 12:46:00 AM (21 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
e62488d
Parents:
7ddcfb8c
Message:

Patch from Eric Norum <eric@…>:

Here's a patch to make the rtems_showroute routine a little more
useful. For `host' route table entries the link-level address is now
displayed. This is equivalent to the old `show arp table'
information displayed by the KA9Q code.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/libnetworking/rtems/rtems_showroute.c

    r7ddcfb8c r718dc95  
    1717
    1818#include <net/if.h>
     19#include <net/if_dl.h>
    1920#include <net/route.h>
    2021
    2122#include <netinet/in.h>
     23
     24#include <arpa/inet.h>
    2225
    2326/*
     
    2629#undef malloc
    2730#undef free
     31
    2832/*
    2933 * Information per route
    3034 */
    3135struct rinfo {
    32         struct in_addr  dst;
    33         struct in_addr  gw_mask;
     36        struct sockaddr dst;
     37        union {
     38                struct sockaddr         sa;
     39                struct sockaddr_in      sin;
     40                struct sockaddr_dl      sdl;
     41        } un;
    3442        unsigned long   pksent;
    3543        unsigned long   expire;
     
    4856        struct rinfo    *routes;
    4957};
     58
     59/*
     60 * Copy address
     61 */
     62static void
     63copyAddress (void *to, void *from, int tolen)
     64{
     65        int ncopy;
     66        struct sockaddr dummy;
     67
     68        if (from == NULL) {
     69                /*
     70                 * Create a fake address of unspecified type
     71                 */
     72                from = &dummy;
     73                dummy.sa_len = 4;
     74                dummy.sa_family = AF_UNSPEC;
     75        }
     76        ncopy = ((struct sockaddr *)from)->sa_len;
     77        if (ncopy > tolen)
     78                ncopy = tolen;
     79        memcpy (to, from, ncopy);
     80}
    5081
    5182/*
     
    79110         * Fill in the route info structure
    80111         */
    81         r->dst = ((struct sockaddr_in *)rt_key(rt))->sin_addr;
    82         if (rt->rt_flags & RTF_GATEWAY)
    83                 r->gw_mask = ((struct sockaddr_in *)rt->rt_gateway)->sin_addr;
    84         else if (!(rt->rt_flags & RTF_HOST))
    85                 r->gw_mask = ((struct sockaddr_in *)rt_mask(rt))->sin_addr;
     112        copyAddress (&r->dst, rt_key(rt), sizeof r->dst);
     113        if (rt->rt_flags & (RTF_GATEWAY | RTF_HOST)) {
     114                copyAddress (&r->un, rt->rt_gateway, sizeof r->un);
     115        }
     116        else {
     117                /*
     118                 * Create a fake address to hold the mask
     119                 */
     120                struct sockaddr_in dummy;
     121
     122                dummy.sin_family = AF_INET;
     123                dummy.sin_len = sizeof dummy;
     124                dummy.sin_addr = ((struct sockaddr_in *)rt_mask(rt))->sin_addr;
     125                copyAddress (&r->un, &dummy, sizeof r->un);
     126        }
    86127        r->flags = rt->rt_flags;
    87128        r->refcnt = rt->rt_refcnt;
     
    95136
    96137/*
    97  * Reentrant version of inet_ntoa
    98  */
    99 char *
    100 inet_ntoa_r (struct in_addr ina, char *buf)
    101 {
    102         unsigned char *ucp = (unsigned char *)&ina;
    103 
    104         sprintf (buf, "%d.%d.%d.%d",
    105                                 ucp[0] & 0xff,
    106                                 ucp[1] & 0xff,
    107                                 ucp[2] & 0xff,
    108                                 ucp[3] & 0xff);
    109                                                                                         return buf;
    110 }
    111 
     138 * Convert link address to ASCII
     139 */
     140static char *
     141link_ascii (struct sockaddr_dl *sdl, char *buf, int bufsize)
     142{
     143        char *cp;
     144        int i;
     145        int first = 1;
     146        int nleft = sdl->sdl_alen;
     147        unsigned char *ap = LLADDR (sdl);
     148        static const char hextab[16] = "0123456789ABCDEF";
     149
     150        cp = buf;
     151        while (nleft && (bufsize > 4)) {
     152                if (first) {
     153                        first = 0;
     154                }
     155                else {
     156                        *cp++ = ':';
     157                        bufsize--;
     158                }
     159                i = *ap++;
     160                *cp++ = hextab[(i >> 4) & 0xf];
     161                *cp++ = hextab[i & 0xf];
     162                nleft--;
     163                bufsize -= 2;
     164        }
     165        *cp = '\0';
     166        return buf;
     167}
     168               
    112169void
    113170rtems_bsdnet_show_inet_routes (void)
     
    118175        int i, error;
    119176
     177        /*
     178         * For now we'll handle only AF_INET
     179         */
    120180        rnh = rt_tables[AF_INET];
    121181        if (!rnh)
     
    134194                return;
    135195        }
    136         printf ("Destination     Gateway/Mask    Flags     Refs     Use Expire Interface\n");
     196        printf ("Destination     Gateway/Mask/Hw    Flags     Refs     Use Expire Interface\n");
    137197        for (i = 0, r = d.routes ; i < d.count ; i++, r++) {
    138198                char buf[30];
    139199                char *cp, *fc, flagbuf[10];
     200                const char *addr;
    140201                unsigned long flagbit;
    141 
    142                 if (r->dst.s_addr == INADDR_ANY)
    143                         cp = "default";
     202                struct sockaddr_in *sin;
     203
     204                sin = (struct sockaddr_in *)&r->dst;
     205                if (sin->sin_addr.s_addr == INADDR_ANY)
     206                        addr = "default";
    144207                else
    145                         cp = inet_ntoa_r (r->dst, buf);
    146                 printf ("%-16s", cp);
    147                 if (!(r->flags & RTF_HOST))
    148                         cp = inet_ntoa_r (r->gw_mask, buf);
    149                 else
    150                         cp = "";
    151                 printf ("%-16s", cp);
     208                        addr = inet_ntop (AF_INET, &sin->sin_addr, buf, sizeof buf);
     209                printf ("%-16s", addr);
     210                switch (r->un.sa.sa_family) {
     211                case AF_INET:
     212                        addr = inet_ntop (AF_INET, &r->un.sin.sin_addr, buf, sizeof buf);
     213                        break;
     214
     215                case AF_LINK:
     216                        addr = link_ascii (&r->un.sdl, buf, sizeof buf);
     217                        break;
     218
     219                default:
     220                        addr = "";
     221                        break;
     222                }
     223                printf ("%-19s", addr);
    152224                fc = "UGHRDM   XLS";
    153225                for (flagbit = 0x1, cp = flagbuf ; *fc ; flagbit <<= 1, fc++) {
  • c/src/lib/libnetworking/rtems/rtems_showroute.c

    r7ddcfb8c r718dc95  
    1717
    1818#include <net/if.h>
     19#include <net/if_dl.h>
    1920#include <net/route.h>
    2021
    2122#include <netinet/in.h>
     23
     24#include <arpa/inet.h>
    2225
    2326/*
     
    2629#undef malloc
    2730#undef free
     31
    2832/*
    2933 * Information per route
    3034 */
    3135struct rinfo {
    32         struct in_addr  dst;
    33         struct in_addr  gw_mask;
     36        struct sockaddr dst;
     37        union {
     38                struct sockaddr         sa;
     39                struct sockaddr_in      sin;
     40                struct sockaddr_dl      sdl;
     41        } un;
    3442        unsigned long   pksent;
    3543        unsigned long   expire;
     
    4856        struct rinfo    *routes;
    4957};
     58
     59/*
     60 * Copy address
     61 */
     62static void
     63copyAddress (void *to, void *from, int tolen)
     64{
     65        int ncopy;
     66        struct sockaddr dummy;
     67
     68        if (from == NULL) {
     69                /*
     70                 * Create a fake address of unspecified type
     71                 */
     72                from = &dummy;
     73                dummy.sa_len = 4;
     74                dummy.sa_family = AF_UNSPEC;
     75        }
     76        ncopy = ((struct sockaddr *)from)->sa_len;
     77        if (ncopy > tolen)
     78                ncopy = tolen;
     79        memcpy (to, from, ncopy);
     80}
    5081
    5182/*
     
    79110         * Fill in the route info structure
    80111         */
    81         r->dst = ((struct sockaddr_in *)rt_key(rt))->sin_addr;
    82         if (rt->rt_flags & RTF_GATEWAY)
    83                 r->gw_mask = ((struct sockaddr_in *)rt->rt_gateway)->sin_addr;
    84         else if (!(rt->rt_flags & RTF_HOST))
    85                 r->gw_mask = ((struct sockaddr_in *)rt_mask(rt))->sin_addr;
     112        copyAddress (&r->dst, rt_key(rt), sizeof r->dst);
     113        if (rt->rt_flags & (RTF_GATEWAY | RTF_HOST)) {
     114                copyAddress (&r->un, rt->rt_gateway, sizeof r->un);
     115        }
     116        else {
     117                /*
     118                 * Create a fake address to hold the mask
     119                 */
     120                struct sockaddr_in dummy;
     121
     122                dummy.sin_family = AF_INET;
     123                dummy.sin_len = sizeof dummy;
     124                dummy.sin_addr = ((struct sockaddr_in *)rt_mask(rt))->sin_addr;
     125                copyAddress (&r->un, &dummy, sizeof r->un);
     126        }
    86127        r->flags = rt->rt_flags;
    87128        r->refcnt = rt->rt_refcnt;
     
    95136
    96137/*
    97  * Reentrant version of inet_ntoa
    98  */
    99 char *
    100 inet_ntoa_r (struct in_addr ina, char *buf)
    101 {
    102         unsigned char *ucp = (unsigned char *)&ina;
    103 
    104         sprintf (buf, "%d.%d.%d.%d",
    105                                 ucp[0] & 0xff,
    106                                 ucp[1] & 0xff,
    107                                 ucp[2] & 0xff,
    108                                 ucp[3] & 0xff);
    109                                                                                         return buf;
    110 }
    111 
     138 * Convert link address to ASCII
     139 */
     140static char *
     141link_ascii (struct sockaddr_dl *sdl, char *buf, int bufsize)
     142{
     143        char *cp;
     144        int i;
     145        int first = 1;
     146        int nleft = sdl->sdl_alen;
     147        unsigned char *ap = LLADDR (sdl);
     148        static const char hextab[16] = "0123456789ABCDEF";
     149
     150        cp = buf;
     151        while (nleft && (bufsize > 4)) {
     152                if (first) {
     153                        first = 0;
     154                }
     155                else {
     156                        *cp++ = ':';
     157                        bufsize--;
     158                }
     159                i = *ap++;
     160                *cp++ = hextab[(i >> 4) & 0xf];
     161                *cp++ = hextab[i & 0xf];
     162                nleft--;
     163                bufsize -= 2;
     164        }
     165        *cp = '\0';
     166        return buf;
     167}
     168               
    112169void
    113170rtems_bsdnet_show_inet_routes (void)
     
    118175        int i, error;
    119176
     177        /*
     178         * For now we'll handle only AF_INET
     179         */
    120180        rnh = rt_tables[AF_INET];
    121181        if (!rnh)
     
    134194                return;
    135195        }
    136         printf ("Destination     Gateway/Mask    Flags     Refs     Use Expire Interface\n");
     196        printf ("Destination     Gateway/Mask/Hw    Flags     Refs     Use Expire Interface\n");
    137197        for (i = 0, r = d.routes ; i < d.count ; i++, r++) {
    138198                char buf[30];
    139199                char *cp, *fc, flagbuf[10];
     200                const char *addr;
    140201                unsigned long flagbit;
    141 
    142                 if (r->dst.s_addr == INADDR_ANY)
    143                         cp = "default";
     202                struct sockaddr_in *sin;
     203
     204                sin = (struct sockaddr_in *)&r->dst;
     205                if (sin->sin_addr.s_addr == INADDR_ANY)
     206                        addr = "default";
    144207                else
    145                         cp = inet_ntoa_r (r->dst, buf);
    146                 printf ("%-16s", cp);
    147                 if (!(r->flags & RTF_HOST))
    148                         cp = inet_ntoa_r (r->gw_mask, buf);
    149                 else
    150                         cp = "";
    151                 printf ("%-16s", cp);
     208                        addr = inet_ntop (AF_INET, &sin->sin_addr, buf, sizeof buf);
     209                printf ("%-16s", addr);
     210                switch (r->un.sa.sa_family) {
     211                case AF_INET:
     212                        addr = inet_ntop (AF_INET, &r->un.sin.sin_addr, buf, sizeof buf);
     213                        break;
     214
     215                case AF_LINK:
     216                        addr = link_ascii (&r->un.sdl, buf, sizeof buf);
     217                        break;
     218
     219                default:
     220                        addr = "";
     221                        break;
     222                }
     223                printf ("%-19s", addr);
    152224                fc = "UGHRDM   XLS";
    153225                for (flagbit = 0x1, cp = flagbuf ; *fc ; flagbit <<= 1, fc++) {
  • c/src/libnetworking/rtems/rtems_showroute.c

    r7ddcfb8c r718dc95  
    1717
    1818#include <net/if.h>
     19#include <net/if_dl.h>
    1920#include <net/route.h>
    2021
    2122#include <netinet/in.h>
     23
     24#include <arpa/inet.h>
    2225
    2326/*
     
    2629#undef malloc
    2730#undef free
     31
    2832/*
    2933 * Information per route
    3034 */
    3135struct rinfo {
    32         struct in_addr  dst;
    33         struct in_addr  gw_mask;
     36        struct sockaddr dst;
     37        union {
     38                struct sockaddr         sa;
     39                struct sockaddr_in      sin;
     40                struct sockaddr_dl      sdl;
     41        } un;
    3442        unsigned long   pksent;
    3543        unsigned long   expire;
     
    4856        struct rinfo    *routes;
    4957};
     58
     59/*
     60 * Copy address
     61 */
     62static void
     63copyAddress (void *to, void *from, int tolen)
     64{
     65        int ncopy;
     66        struct sockaddr dummy;
     67
     68        if (from == NULL) {
     69                /*
     70                 * Create a fake address of unspecified type
     71                 */
     72                from = &dummy;
     73                dummy.sa_len = 4;
     74                dummy.sa_family = AF_UNSPEC;
     75        }
     76        ncopy = ((struct sockaddr *)from)->sa_len;
     77        if (ncopy > tolen)
     78                ncopy = tolen;
     79        memcpy (to, from, ncopy);
     80}
    5081
    5182/*
     
    79110         * Fill in the route info structure
    80111         */
    81         r->dst = ((struct sockaddr_in *)rt_key(rt))->sin_addr;
    82         if (rt->rt_flags & RTF_GATEWAY)
    83                 r->gw_mask = ((struct sockaddr_in *)rt->rt_gateway)->sin_addr;
    84         else if (!(rt->rt_flags & RTF_HOST))
    85                 r->gw_mask = ((struct sockaddr_in *)rt_mask(rt))->sin_addr;
     112        copyAddress (&r->dst, rt_key(rt), sizeof r->dst);
     113        if (rt->rt_flags & (RTF_GATEWAY | RTF_HOST)) {
     114                copyAddress (&r->un, rt->rt_gateway, sizeof r->un);
     115        }
     116        else {
     117                /*
     118                 * Create a fake address to hold the mask
     119                 */
     120                struct sockaddr_in dummy;
     121
     122                dummy.sin_family = AF_INET;
     123                dummy.sin_len = sizeof dummy;
     124                dummy.sin_addr = ((struct sockaddr_in *)rt_mask(rt))->sin_addr;
     125                copyAddress (&r->un, &dummy, sizeof r->un);
     126        }
    86127        r->flags = rt->rt_flags;
    87128        r->refcnt = rt->rt_refcnt;
     
    95136
    96137/*
    97  * Reentrant version of inet_ntoa
    98  */
    99 char *
    100 inet_ntoa_r (struct in_addr ina, char *buf)
    101 {
    102         unsigned char *ucp = (unsigned char *)&ina;
    103 
    104         sprintf (buf, "%d.%d.%d.%d",
    105                                 ucp[0] & 0xff,
    106                                 ucp[1] & 0xff,
    107                                 ucp[2] & 0xff,
    108                                 ucp[3] & 0xff);
    109                                                                                         return buf;
    110 }
    111 
     138 * Convert link address to ASCII
     139 */
     140static char *
     141link_ascii (struct sockaddr_dl *sdl, char *buf, int bufsize)
     142{
     143        char *cp;
     144        int i;
     145        int first = 1;
     146        int nleft = sdl->sdl_alen;
     147        unsigned char *ap = LLADDR (sdl);
     148        static const char hextab[16] = "0123456789ABCDEF";
     149
     150        cp = buf;
     151        while (nleft && (bufsize > 4)) {
     152                if (first) {
     153                        first = 0;
     154                }
     155                else {
     156                        *cp++ = ':';
     157                        bufsize--;
     158                }
     159                i = *ap++;
     160                *cp++ = hextab[(i >> 4) & 0xf];
     161                *cp++ = hextab[i & 0xf];
     162                nleft--;
     163                bufsize -= 2;
     164        }
     165        *cp = '\0';
     166        return buf;
     167}
     168               
    112169void
    113170rtems_bsdnet_show_inet_routes (void)
     
    118175        int i, error;
    119176
     177        /*
     178         * For now we'll handle only AF_INET
     179         */
    120180        rnh = rt_tables[AF_INET];
    121181        if (!rnh)
     
    134194                return;
    135195        }
    136         printf ("Destination     Gateway/Mask    Flags     Refs     Use Expire Interface\n");
     196        printf ("Destination     Gateway/Mask/Hw    Flags     Refs     Use Expire Interface\n");
    137197        for (i = 0, r = d.routes ; i < d.count ; i++, r++) {
    138198                char buf[30];
    139199                char *cp, *fc, flagbuf[10];
     200                const char *addr;
    140201                unsigned long flagbit;
    141 
    142                 if (r->dst.s_addr == INADDR_ANY)
    143                         cp = "default";
     202                struct sockaddr_in *sin;
     203
     204                sin = (struct sockaddr_in *)&r->dst;
     205                if (sin->sin_addr.s_addr == INADDR_ANY)
     206                        addr = "default";
    144207                else
    145                         cp = inet_ntoa_r (r->dst, buf);
    146                 printf ("%-16s", cp);
    147                 if (!(r->flags & RTF_HOST))
    148                         cp = inet_ntoa_r (r->gw_mask, buf);
    149                 else
    150                         cp = "";
    151                 printf ("%-16s", cp);
     208                        addr = inet_ntop (AF_INET, &sin->sin_addr, buf, sizeof buf);
     209                printf ("%-16s", addr);
     210                switch (r->un.sa.sa_family) {
     211                case AF_INET:
     212                        addr = inet_ntop (AF_INET, &r->un.sin.sin_addr, buf, sizeof buf);
     213                        break;
     214
     215                case AF_LINK:
     216                        addr = link_ascii (&r->un.sdl, buf, sizeof buf);
     217                        break;
     218
     219                default:
     220                        addr = "";
     221                        break;
     222                }
     223                printf ("%-19s", addr);
    152224                fc = "UGHRDM   XLS";
    153225                for (flagbit = 0x1, cp = flagbuf ; *fc ; flagbit <<= 1, fc++) {
  • cpukit/libnetworking/rtems/rtems_showroute.c

    r7ddcfb8c r718dc95  
    1717
    1818#include <net/if.h>
     19#include <net/if_dl.h>
    1920#include <net/route.h>
    2021
    2122#include <netinet/in.h>
     23
     24#include <arpa/inet.h>
    2225
    2326/*
     
    2629#undef malloc
    2730#undef free
     31
    2832/*
    2933 * Information per route
    3034 */
    3135struct rinfo {
    32         struct in_addr  dst;
    33         struct in_addr  gw_mask;
     36        struct sockaddr dst;
     37        union {
     38                struct sockaddr         sa;
     39                struct sockaddr_in      sin;
     40                struct sockaddr_dl      sdl;
     41        } un;
    3442        unsigned long   pksent;
    3543        unsigned long   expire;
     
    4856        struct rinfo    *routes;
    4957};
     58
     59/*
     60 * Copy address
     61 */
     62static void
     63copyAddress (void *to, void *from, int tolen)
     64{
     65        int ncopy;
     66        struct sockaddr dummy;
     67
     68        if (from == NULL) {
     69                /*
     70                 * Create a fake address of unspecified type
     71                 */
     72                from = &dummy;
     73                dummy.sa_len = 4;
     74                dummy.sa_family = AF_UNSPEC;
     75        }
     76        ncopy = ((struct sockaddr *)from)->sa_len;
     77        if (ncopy > tolen)
     78                ncopy = tolen;
     79        memcpy (to, from, ncopy);
     80}
    5081
    5182/*
     
    79110         * Fill in the route info structure
    80111         */
    81         r->dst = ((struct sockaddr_in *)rt_key(rt))->sin_addr;
    82         if (rt->rt_flags & RTF_GATEWAY)
    83                 r->gw_mask = ((struct sockaddr_in *)rt->rt_gateway)->sin_addr;
    84         else if (!(rt->rt_flags & RTF_HOST))
    85                 r->gw_mask = ((struct sockaddr_in *)rt_mask(rt))->sin_addr;
     112        copyAddress (&r->dst, rt_key(rt), sizeof r->dst);
     113        if (rt->rt_flags & (RTF_GATEWAY | RTF_HOST)) {
     114                copyAddress (&r->un, rt->rt_gateway, sizeof r->un);
     115        }
     116        else {
     117                /*
     118                 * Create a fake address to hold the mask
     119                 */
     120                struct sockaddr_in dummy;
     121
     122                dummy.sin_family = AF_INET;
     123                dummy.sin_len = sizeof dummy;
     124                dummy.sin_addr = ((struct sockaddr_in *)rt_mask(rt))->sin_addr;
     125                copyAddress (&r->un, &dummy, sizeof r->un);
     126        }
    86127        r->flags = rt->rt_flags;
    87128        r->refcnt = rt->rt_refcnt;
     
    95136
    96137/*
    97  * Reentrant version of inet_ntoa
    98  */
    99 char *
    100 inet_ntoa_r (struct in_addr ina, char *buf)
    101 {
    102         unsigned char *ucp = (unsigned char *)&ina;
    103 
    104         sprintf (buf, "%d.%d.%d.%d",
    105                                 ucp[0] & 0xff,
    106                                 ucp[1] & 0xff,
    107                                 ucp[2] & 0xff,
    108                                 ucp[3] & 0xff);
    109                                                                                         return buf;
    110 }
    111 
     138 * Convert link address to ASCII
     139 */
     140static char *
     141link_ascii (struct sockaddr_dl *sdl, char *buf, int bufsize)
     142{
     143        char *cp;
     144        int i;
     145        int first = 1;
     146        int nleft = sdl->sdl_alen;
     147        unsigned char *ap = LLADDR (sdl);
     148        static const char hextab[16] = "0123456789ABCDEF";
     149
     150        cp = buf;
     151        while (nleft && (bufsize > 4)) {
     152                if (first) {
     153                        first = 0;
     154                }
     155                else {
     156                        *cp++ = ':';
     157                        bufsize--;
     158                }
     159                i = *ap++;
     160                *cp++ = hextab[(i >> 4) & 0xf];
     161                *cp++ = hextab[i & 0xf];
     162                nleft--;
     163                bufsize -= 2;
     164        }
     165        *cp = '\0';
     166        return buf;
     167}
     168               
    112169void
    113170rtems_bsdnet_show_inet_routes (void)
     
    118175        int i, error;
    119176
     177        /*
     178         * For now we'll handle only AF_INET
     179         */
    120180        rnh = rt_tables[AF_INET];
    121181        if (!rnh)
     
    134194                return;
    135195        }
    136         printf ("Destination     Gateway/Mask    Flags     Refs     Use Expire Interface\n");
     196        printf ("Destination     Gateway/Mask/Hw    Flags     Refs     Use Expire Interface\n");
    137197        for (i = 0, r = d.routes ; i < d.count ; i++, r++) {
    138198                char buf[30];
    139199                char *cp, *fc, flagbuf[10];
     200                const char *addr;
    140201                unsigned long flagbit;
    141 
    142                 if (r->dst.s_addr == INADDR_ANY)
    143                         cp = "default";
     202                struct sockaddr_in *sin;
     203
     204                sin = (struct sockaddr_in *)&r->dst;
     205                if (sin->sin_addr.s_addr == INADDR_ANY)
     206                        addr = "default";
    144207                else
    145                         cp = inet_ntoa_r (r->dst, buf);
    146                 printf ("%-16s", cp);
    147                 if (!(r->flags & RTF_HOST))
    148                         cp = inet_ntoa_r (r->gw_mask, buf);
    149                 else
    150                         cp = "";
    151                 printf ("%-16s", cp);
     208                        addr = inet_ntop (AF_INET, &sin->sin_addr, buf, sizeof buf);
     209                printf ("%-16s", addr);
     210                switch (r->un.sa.sa_family) {
     211                case AF_INET:
     212                        addr = inet_ntop (AF_INET, &r->un.sin.sin_addr, buf, sizeof buf);
     213                        break;
     214
     215                case AF_LINK:
     216                        addr = link_ascii (&r->un.sdl, buf, sizeof buf);
     217                        break;
     218
     219                default:
     220                        addr = "";
     221                        break;
     222                }
     223                printf ("%-19s", addr);
    152224                fc = "UGHRDM   XLS";
    153225                for (flagbit = 0x1, cp = flagbuf ; *fc ; flagbit <<= 1, fc++) {
Note: See TracChangeset for help on using the changeset viewer.