How can I get the ip address of my host system
Hello
I have tried to get the ip address of my host mechine , I have used the following code but here I am geting only MAC address of eth0.
How can I find mac address of eth1 and also init addr of ppp0 when I will connect any data card,
Actually I have to make a C equivalent code of the following shell script
ifconfig eth0 up
eth0=`echo ""`
echo $eth0
for fn in `ifconfig eth0 | grep "Ethernet HWaddr" | sed "s/.*Ethernet HWaddr \(.*\) .*/\1/"`; do
eth0=`echo "$fn$eth0"`;
done
echo $eth0 > eth0.txt
sleep 10
wvdial&
sleep 30
ifconfig ppp0 up
ping valuefirstmessaging.com > /dev/null &
ppp0=`echo ""`
echo $ppp0
for fn in `ifconfig ppp0 | grep "inet addr" | cut -d: -f2 | awk '{print $1}'`; do
ppp0=`echo "$fn$ppp0"`;
done
echo $ppp0 > ppp0.txt
the c code is for getting the eth0 address is
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#ifdef Linux
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/if.h>
#endif
#ifdef HPUX
#include <netio.h>
#endif
#ifdef AIX
#include <sys/ndd_var.h>
#include <sys/kinfo.h>
#endif
long mac_addr_sys ( u_char *addr)
{
/* implementation for Linux */
#ifdef Linux
struct ifreq ifr;
struct ifreq *IFR;
struct ifconf ifc;
char buf[1024];
int s, i;
int ok = 0;
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s==-1) {
return -1;
}
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
ioctl(s, SIOCGIFCONF, &ifc);
IFR = ifc.ifc_req;
for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR++) {
strcpy(ifr.ifr_name, IFR->ifr_name);
if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) {
if (! (ifr.ifr_flags & IFF_LOOPBACK)) {
if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
ok = 1;
break;
}
}
}
}
close(s);
if (ok) {
bcopy( ifr.ifr_hwaddr.sa_data, addr, 6);
}
else {
return -1;
}
return 0;
#endif
/* implementation for HP-UX */
#ifdef HPUX
#define LAN_DEV0 "/dev/lan0"
intfd;
struct fisiocnt_block;
inti;
charnet_buf[sizeof(LAN_DEV0)+1];
char*p;
(void)sprintf(net_buf, "%s", LAN_DEV0);
p = net_buf + strlen(net_buf) - 1;
/*
* Get 802.3 address from card by opening the driver and interrogating it.
*/
for (i = 0; i < 10; i++, (*p)++) {
if ((fd = open (net_buf, O_RDONLY)) != -1) {
iocnt_block.reqtype = LOCAL_ADDRESS;
ioctl (fd, NETSTAT, &iocnt_block);
close (fd);
if (iocnt_block.vtype == 6)
break;
}
}
if (fd == -1 || iocnt_block.vtype != 6) {
return -1;
}
bcopy( &iocnt_block.value.s[0], addr, 6);
return 0;
#endif /* HPUX */
/* implementation for AIX */
#ifdef AIX
int size;
struct kinfo_ndd *nddp;
size = getkerninfo(KINFO_NDD, 0, 0, 0);
if (size <= 0) {
return -1;
}
nddp = (struct kinfo_ndd *)malloc(size);
if (!nddp) {
return -1;
}
if (getkerninfo(KINFO_NDD, nddp, &size, 0) < 0) {
free(nddp);
return -1;
}
bcopy(nddp->ndd_addr, addr, 6);
free(nddp);
return 0;
#endif
/* Not implemented platforms */
return -1;
}
/***********************************************************************/
/*
* Main (only for testing)
*/
#ifdef MAIN
int main( int argc, char **argv)
{
long stat;
int i;
u_char addr[6];
FILE *fp;
fp = fopen("eth0.txt","w");
stat = mac_addr_sys( addr);
if (0 == stat) {
//printf( "MAC address = ");
for (i=0; i<6; ++i) {
fprintf(fp,"%2.2x", addr[i]);
}
printf( "\n");
}
else {
fprintf( stderr, "can't get MAC address\n");
exit( 1);
}
return 0;
}
#endif
/****************************************************************************************
E.g you want to use on Linux, save it as file.c simply compile like this:
gcc -O2 -DMAIN -DLinux file.c -o file
And run it
./file
MAC address = 0008c7e9e386
Compare with /sbin/ifconfig result:
/sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:08:C7:E9:E3:86
inet addr:***.***.***.*** Bcast:***.***.***.*** Mask:255.255.255.0
inet6 addr: ********************* Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:265555947 errors:0 dropped:0 overruns:0 frame:0
TX packets:50507373 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4090310752 (3.8 GiB) TX bytes:1085018636 (1.0 GiB)
*********************************************************************************************/
please respond me.
Thanks in advance
Dwijesh.
|