#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <unistd.h>
typedef int s32;
typedef char s8;
#define IP_ADDR 16
static void NPLUS1_GetSlaveIP(s8 *slave_addr, s8* master_addr){
#define MAXINTERFACES 16
int fd, interface;
struct ifreq buf[MAXINTERFACES];
struct arpreq arp;
struct ifconf ifc;
char mac[32] = "";
in_addr_t master = 0;
struct sockaddr_in cmp_addr;
inet_aton(master_addr, (struct in_addr*)&cmp_addr);
master = ((struct in_addr*)&cmp_addr)->s_addr;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
ifc.ifc_len = sizeof buf;
ifc.ifc_buf = (caddr_t) buf;
if (!ioctl(fd, SIOCGIFCONF, (char *) &ifc)) {
interface = ifc.ifc_len / sizeof(struct ifreq);
while (interface-- > 0) {
if (!(ioctl(fd, SIOCGIFFLAGS, (char *) &buf[interface]))) {
if ((buf[interface].ifr_flags & IFF_LOOPBACK) == 0 &&
(buf[interface].ifr_flags & IFF_UP) &&
(buf[interface].ifr_flags & IFF_RUNNING) == 0) {
continue;
}
}
in_addr_t ip_addr = 0, net_mask = 0;
if (!(ioctl(fd, SIOCGIFNETMASK, (char *) &buf[interface]))) {
net_mask = ((struct sockaddr_in*) (&buf[interface].ifr_addr))->sin_addr.s_addr;
} else {
char str[256] = "";
sprintf(str, "cpm: ioctl device %s",buf[interface].ifr_name);
perror(str);
}
/*Get IP of the net card */
if (!(ioctl(fd, SIOCGIFADDR, (char *) &buf[interface]))) {
ip_addr = ((struct sockaddr_in*) (&buf[interface].ifr_addr))->sin_addr.s_addr;
if((ip_addr&net_mask)==(master&net_mask))
{
strncpy(slave_addr, inet_ntoa(((struct sockaddr_in*) (&buf[interface].ifr_addr))->sin_addr), IP_ADDR);
break;
}
} else {
char str[256] = "";
sprintf(str, "cpm: ioctl device %s",buf[interface].ifr_name);
perror(str);
}
} //end of while
} else
perror("cpm: ioctl");
} else
perror("cpm: socket");
close(fd);
return;
}
int main(int argc, char **argv){
s8 slave_addr[255];
memset(slave_addr, 0, 255);
NPLUS1_GetSlaveIP(slave_addr, "10.78.115.121");
printf("%s\n",slave_addr);
}