On 03/23/2014 07:17 AM, Roman Bogorodskiy wrote:
To ease mocking for bhyve unit tests move
virBhyveTapGetRealDeviceName()
out of bhyve_command.c to virnetdevtap and rename it to
virNetDevTapGetRealDeviceName().
---
src/bhyve/bhyve_command.c | 70 +----------------------------------------
src/libvirt_private.syms | 1 +
src/util/virnetdevtap.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++
src/util/virnetdevtap.h | 3 ++
4 files changed, 84 insertions(+), 69 deletions(-)
@@ -72,6 +79,78 @@ virNetDevTapGetName(int tapfd ATTRIBUTE_UNUSED, char **ifname
ATTRIBUTE_UNUSED)
#endif
}
+/**
+ * virNetDevTapGetRealDeviceName:
+ * @ifname: the interface name
+ *
+ * Lookup real interface name (i.e. name of the device entry in /dev),
+ * because e.g. on FreeBSD if we rename tap device to vnetN its device
+ * entry still remains unchanged (/dev/tapX), but bhyve needs a name
+ * that matches /dev entry.
+ *
+ * Returns the proper interface name or NULL if no corresponding interface
+ * found.
+ */
+char*
+virNetDevTapGetRealDeviceName(char *ifname)
+{
+ char *ret = NULL;
+ struct dirent *dp;
+ char *devpath = NULL;
+ int fd;
+
+ DIR *dirp = opendir("/dev");
+ if (dirp == NULL) {
+ virReportSystemError(errno,
+ _("Failed to opendir path '%s'"),
+ "/dev");
+ return NULL;
+ }
+
+ while ((dp = readdir(dirp)) != NULL) {
+ if (STRPREFIX(dp->d_name, "tap")) {
+ struct ifreq ifr;
+ if (virAsprintf(&devpath, "/dev/%s", dp->d_name) < 0) {
+ goto cleanup;
+ }
+ if ((fd = open(devpath, O_RDWR)) < 0) {
+ virReportSystemError(errno, _("Unable to open '%s'"),
devpath);
+ goto cleanup;
+ }
+
+ if (ioctl(fd, TAPGIFNAME, (void *)&ifr) < 0) {
This fails to build on Linux. The whole function should be #ifdef'd and return
-1 on non-FreeBSD.
+ virReportSystemError(errno, "%s",
+ _("Unable to query tap interface
name"));
+ goto cleanup;
+ }
+
Jan