i have written this sample program to get the interface address but it seems to give me only the lo interface how do i get information about the eth0 interface can somebody gimme some pointers here -SIGTERM amit -- As flies to wanton boys are we to the gods; they kill us for their sport. -- Shakespeare, "King Lear"
#include<asm/types.h> #include<sys/types.h> //#include<bits/sockaddr.h> #include<sys/socket.h> #include<linux/netlink.h> #include<linux/rtnetlink.h> int main() { int sockfd =0; int bindid =0; char buff[1024]; char temp_addr[50]; int len =0; struct { struct nlmsghdr nl; struct rtgenmsg g; }req; struct nlmsghdr *reply; struct sockaddr_nl l_local; struct sockaddr_nl l_sendto; struct ifinfomsg *info; struct ifaddrmsg *ifaddr; struct rtattr *rta; memset(buff,'\0',1024); sockfd = socket(PF_NETLINK,SOCK_DGRAM,NETLINK_ROUTE); l_local.nl_family = AF_NETLINK; l_local.nl_groups = 0; bindid = bind(sockfd,(struct sockaddr *)&l_local,sizeof(struct sockaddr_nl)); perror("Bind Result"); l_sendto.nl_family = AF_NETLINK; req.nl.nlmsg_len = sizeof(req); req.nl.nlmsg_type = RTM_GETADDR; req.nl.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST; req.nl.nlmsg_pid = 0; req.nl.nlmsg_seq = 2; req.g.rtgen_family = AF_INET; // sendto(sockfd,(void *)&req,sizeof(req),0,(struct sockaddr *)&l_sendto,sizeof(struct sockaddr_nl)); send(sockfd, &req, req.nl.nlmsg_len, 0); perror("sendto Result"); //while(recv(sockfd,buff,1024,0)) recv(sockfd,buff,1024,0); perror("recvfrom Result"); reply = (struct nlmsghdr *)malloc(sizeof(struct nlmsghdr)); reply = (struct nlmsghdr *)buff; printf("\nAfter cast\n"); // info = (struct ifinfomsg *)malloc(sizeof(struct ifinfomsg)); ifaddr = (struct ifaddrmsg *)malloc(sizeof(struct ifaddrmsg)); ifaddr = NLMSG_DATA(reply); rta = (struct rtattr *)malloc(sizeof(struct rtattr)); rta = IFLA_RTA(ifaddr); printf("\nAfter cast\n"); len = reply->nlmsg_len; //RTA_OK(rta,len); printf("Length is %d\n",len); while(RTA_OK(rta, len)) { switch(rta->rta_type) { case IFA_LOCAL: inet_ntop(AF_INET, RTA_DATA(rta), temp_addr, 50); printf("addr: %s - \n", temp_addr); break; case IFA_ADDRESS: inet_ntop(AF_INET, RTA_DATA(rta), temp_addr, 50); printf("addr: %s - \n", temp_addr); break; case IFA_LABEL: printf("InterFace Name: %s - \n",RTA_DATA(rta)); break; case IFA_BROADCAST: inet_ntop(AF_INET, RTA_DATA(rta), temp_addr, 50); printf("addr: %s - \n", temp_addr); break; case IFA_ANYCAST: inet_ntop(AF_INET, RTA_DATA(rta), temp_addr, 50); printf("addr: %s - \n", temp_addr); break; case IFA_CACHEINFO: printf("cache Info\n"); } printf("\nLooping\n"); rta = RTA_NEXT(rta,len); } return 0; }