From 2f859a3c10c8a038661592fcdfe003ec97cca938 Mon Sep 17 00:00:00 2001 From: Juergen Lock Date: Fri, 20 Nov 2009 23:31:55 +0100 Subject: 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 Signed-off-by: Blue Swirl --- net/tap-bsd.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) 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); -- cgit v1.2.1