Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Dec 2015 12:26:16 -0500
From:      Ken Moore <ken@pcbsd.org>
To:        "Andrey V. Elsukov" <bu7cher@yandex.ru>, Hiroki Sato <hrs@FreeBSD.org>
Cc:        freebsd-net@freebsd.org
Subject:   Re: IPv6 Address as text (C)
Message-ID:  <56686438.8000109@pcbsd.org>
In-Reply-To: <56685C23.600@yandex.ru>
References:  <5668369F.9020309@pcbsd.org> <20151209.233515.1592617248580059512.hrs@allbsd.org> <566847F3.7060900@pcbsd.org> <56685C23.600@yandex.ru>

next in thread | previous in thread | raw e-mail | index | archive | help


On 12/09/2015 11:51, Andrey V. Elsukov wrote:
> On 09.12.15 18:25, Ken Moore wrote:
>
> Simple example:
>
> #include <sys/cdefs.h>
> __FBSDID("$FreeBSD$");
>
> #include <sys/types.h>
> #include <sys/socket.h>
> #include <arpa/inet.h>
>
> #include <err.h>
> #include <ifaddrs.h>
> #include <netdb.h>
> #include <stdio.h>
> #include <string.h>
>
> int
> main(int argc, char **argv)
> {
>          char buf[INET6_ADDRSTRLEN];
>          struct ifaddrs *ifap, *ifa;
>          int error;
>
>          if (getifaddrs(&ifap) != 0)
>                  err(1, "getifaddrs");
>          for (ifa = ifap; ifa; ifa = ifa->ifa_next)
>                  if (ifa->ifa_addr->sa_family == AF_INET6) {
>                          error = getnameinfo(ifa->ifa_addr,
>                              ifa->ifa_addr->sa_len, buf, sizeof(buf),
>                              NULL, 0, NI_NUMERICHOST);
>                          if (error != 0)
>                                  err(1, "%s", gai_strerror(error));
>                          printf("%s\n", buf);
>                  }
>          freeifaddrs(ifap);
>          return (0);
> }
>
Thanks!
Using getifaddrs() to fetch the pre-existing socket address did the trick.

Here is the final form of the function which works (although I am sure I 
can clean it up a bit still...):

[code]
QString NetDevice::ipv6AsString(){
   //Get the sockaddr for the device
   struct sockaddr *sadd = 0;
   struct ifaddrs *addrs;
   if( 0!=getifaddrs( &addrs ) ){ qDebug() << "Could not get addrs"; 
return ""; }
   while(sadd==0 && addrs!=0){
     if( QString(addrs->ifa_name)==name && 
addrs->ifa_addr->sa_family==AF_INET6){
       //Found device (with IPv6 address)
       sadd = addrs->ifa_addr;
       break;
     }else{
       //Move to the next device
       addrs = addrs->ifa_next;
     }
   }
   free(addrs);
   if(sadd==0){ qDebug() << "No socket address found"; return ""; }
   //Now get the IPv6 address in string form
   char straddr[INET6_ADDRSTRLEN];
   int err = getnameinfo(sadd, sadd->sa_len, straddr, 
sizeof(straddr),NULL, 0, NI_NUMERICHOST);
   if(err!=0){
     qDebug() << "getnameinfo error:" << gai_strerror(err);
     return "";
   }else{
     return QString(straddr);
   }
}
[/code]

Thanks everybody!

-- 
~~ Ken Moore ~~
PC-BSD/iXsystems




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?56686438.8000109>