diff options
author | Juergen Lock <nox@jelal.kn-bremen.de> | 2009-11-20 23:31:55 +0100 |
---|---|---|
committer | Blue Swirl <blauwirbel@gmail.com> | 2009-11-21 09:32:08 +0000 |
commit | 2f859a3c10c8a038661592fcdfe003ec97cca938 (patch) | |
tree | 3503aa689f0820aa9abaa4b3a5c0b44aa1340837 /net/tap-bsd.c | |
parent | 39ca4c083264c9646b986f76d018fd808bac89fc (diff) |
tap-bsd: handle ifname on FreeBSD hosts
Handle ifname on FreeBSD hosts; if no ifname is given, always start
the search from tap0. (Simplified/cleaned up version of what has been
in the FreeBSD ports for a long time.)
Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Diffstat (limited to 'net/tap-bsd.c')
-rw-r--r-- | net/tap-bsd.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/net/tap-bsd.c b/net/tap-bsd.c index bde2083e57..0f8ad4ad71 100644 --- a/net/tap-bsd.c +++ b/net/tap-bsd.c @@ -49,11 +49,39 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required char *dev; struct stat s; +#ifdef __FreeBSD__ + /* if no ifname is given, always start the search from tap0. */ + int i; + char dname[100]; + + for (i = 0; i < 10; i++) { + if (*ifname) { + snprintf(dname, sizeof dname, "/dev/%s", ifname); + } else { + snprintf(dname, sizeof dname, "/dev/tap%d", i); + } + TFR(fd = open(dname, O_RDWR)); + if (fd >= 0) { + break; + } + else if (errno == ENXIO || errno == ENOENT) { + break; + } + if (*ifname) { + break; + } + } + if (fd < 0) { + qemu_error("warning: could not open %s (%s): no virtual network emulation\n", dname, strerror(errno)); + return -1; + } +#else TFR(fd = open("/dev/tap", O_RDWR)); if (fd < 0) { fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n"); return -1; } +#endif fstat(fd, &s); dev = devname(s.st_rdev, S_IFCHR); |