IP Informationen von tap interface

04/03/2008 - 14:34 von ganto | Report spam
Hallo zusammen

Ich möchte gerne die IP Adresse eines tap-Interfaces herausfinden.
Wenn ich aber per ioctl das versuche, gibt es mir immer einen "Invalid
argument" Fehler. Klappt das bei tap generell nicht mit ioctl? Ich mir
noch den Code von ifconfig und iproute2 angeschaut, aber bei ifconfig
habe ich nicht durchgeblickt, wie sie das gemacht haben (sorry, bin
noch ein C Einsteiger) und bei iproute2 verwenden sie dafür netlink
sockets, was mir etwas zu aufwàndig ist.

Hier mein Code:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/if.h>
#include <linux/if_tun.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(void)
{
int fd;
char dev[IFNAMSIZ] = "tap3";
fd = open("/dev/net/tun", O_RDWR);
if( fd < 0 )
{
printf("Error opening /dev/net/tun (%s)", strerror(errno));
exit(1);
}

struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP; /** set flag for TAP device */

if (*dev)
{
memcpy(ifr.ifr_name, dev, IFNAMSIZ);
}
if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0)
{
close(fd);
printf("Error ioctl on %s (%s)", dev, strerror(errno));
exit(1);
}
strcpy(dev, ifr.ifr_name);

/** get ip addresses */
struct ifconf ifc;
memset(&ifc, 0, sizeof(ifc));
if (ioctl(fd, SIOCGIFCONF, (void *) &ifc) < 0)
{
close(fd);
printf("Couldn't get IPs (%s)", strerror(errno));
}

exit(0);
}

Dann die Netzwerk Konfiguration:

merkur ~ # ip addr show tap3
8: tap3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
qlen 500
link/ether 00:ff:e8:65:2c:3a brd ff:ff:ff:ff:ff:ff
inet 192.168.0.1/24 brd 192.168.0.255 scope global tap3

und schliesslich der Output:

merkur ~ # ./get_ip
Couldn't get IPs (Invalid argument)

Kann mir da jemand weiterhelfen oder zumindest ein paar Tipps geben?

Vielen Dank zum Voraus
Reto
 

Lesen sie die antworten

#1 reto
04/03/2008 - 14:41 | Warnen spam
On Mar 4, 2:34 pm, ganto wrote:

if (ioctl(fd, SIOCGIFCONF, (void *) &ifc) < 0)



Es gibt übrigens den gleichen Fehler mit:

ioctl(fd, SIOCGIFADDR, (void *) &ifr)

Ähnliche fragen