From owner-freebsd-net@freebsd.org Wed Dec 9 17:26:19 2015 Return-Path: Delivered-To: freebsd-net@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 8C5959D4116 for ; Wed, 9 Dec 2015 17:26:19 +0000 (UTC) (envelope-from ken@pcbsd.org) Received: from barracuda.ixsystems.com (mail.ixsystems.com [69.198.165.135]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "*.ixsystems.com", Issuer "Go Daddy Secure Certificate Authority - G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 66ED31382 for ; Wed, 9 Dec 2015 17:26:19 +0000 (UTC) (envelope-from ken@pcbsd.org) X-ASG-Debug-ID: 1449681976-08ca042abd06a80002-QdxwpM Received: from [192.168.1.130] (24-151-177-78.dhcp.kgpt.tn.charter.com [24.151.177.78]) by barracuda.ixsystems.com with ESMTP id Sj8SG6FUrvXu21nv (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO); Wed, 09 Dec 2015 09:26:17 -0800 (PST) X-Barracuda-Envelope-From: ken@pcbsd.org X-Barracuda-AUTH-User: ken@pcbsd.org X-Barracuda-Apparent-Source-IP: 24.151.177.78 Subject: Re: IPv6 Address as text (C) To: "Andrey V. Elsukov" , Hiroki Sato X-ASG-Orig-Subj: Re: IPv6 Address as text (C) References: <5668369F.9020309@pcbsd.org> <20151209.233515.1592617248580059512.hrs@allbsd.org> <566847F3.7060900@pcbsd.org> <56685C23.600@yandex.ru> Cc: freebsd-net@freebsd.org From: Ken Moore Message-ID: <56686438.8000109@pcbsd.org> Date: Wed, 9 Dec 2015 12:26:16 -0500 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0 MIME-Version: 1.0 In-Reply-To: <56685C23.600@yandex.ru> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 24-151-177-78.dhcp.kgpt.tn.charter.com[24.151.177.78] X-Barracuda-Start-Time: 1449681977 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://10.2.0.41:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at ixsystems.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.25110 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 Dec 2015 17:26:19 -0000 On 12/09/2015 11:51, Andrey V. Elsukov wrote: > On 09.12.15 18:25, Ken Moore wrote: > > Simple example: > > #include > __FBSDID("$FreeBSD$"); > > #include > #include > #include > > #include > #include > #include > #include > #include > > 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