Hi,
I am able to retrieve IPv4 addresses with ioctl. But it is not returning IPv6 addresses. My requirement is to get both IPv4 and IPv6 addresses. I can not use getifaddrs() since it has to be common code between linux, solaris and aix. Solaris and AIX are not having getifaddrs(). Following code is returning only IPv4 addresses.
Code:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define num 5
int n;
int main(){
int sd,err,ifsize;
struct ifconf ifc;
struct ifreq *ifr;
struct ifreq ifreq;
struct sockaddr_in *sa;
char addrss[INET6_ADDRSTRLEN];
char *cp,*i;
void *in_addr;
sd=socket(AF_INET6,SOCK_DGRAM,0);
ifsize=num*sizeof(struct ifreq);
ifc.ifc_buf=(char *)malloc(ifsize);
ifc.ifc_len=ifsize;
err=ioctl(sd, (int)SIOCGIFCONF, (caddr_t)&ifc); n=(ifc.ifc_len/sizeof(struct ifreq)); printf("Interfaces = %d\n",n);
i=ifc.ifc_len+ifc.ifc_buf;
for(cp=ifc.ifc_buf;cp<i;cp+=sizeof(ifr->ifr_name)+sizeof(ifr->ifr_addr)){
ifr=(struct ifreq *)cp;
ifreq=*ifr;
sa=(struct sockaddr_in *)&ifreq.ifr_addr;
in_addr = &(sa->sin_addr);
inet_ntop(sa->sin_family,in_addr,addrss, INET6_ADDRSTRLEN);
printf("interface name=%s %s\n",ifreq.ifr_name,addrss);
ifc.ifc_req++;
}
close(sd);
return 0;
}
Please help me out in correcting this code for getting both IPv4 and IPv6 addresses.