From 740d98a17d0505d0be6cbf8385af8896a2455eca Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Sat, 20 Apr 2013 11:11:24 +0200 Subject: [PATCH] virnetdevtap: add virNetDevTapGetName This will be used on a tap file descriptor returned by the bridge helper to populate the element, because the helper does not provide the interface name. Signed-off-by: Paolo Bonzini --- src/libvirt_private.syms | 1 + src/util/virnetdevtap.c | 34 ++++++++++++++++++++++++++++++++++ src/util/virnetdevtap.h | 3 +++ 3 files changed, 38 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 0bb6f5f3d5..a7e1eeb65d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1533,6 +1533,7 @@ virNetDevOpenvswitchSetMigrateData; virNetDevTapCreate; virNetDevTapCreateInBridgePort; virNetDevTapDelete; +virNetDevTapGetName; # util/virnetdevveth.h diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c index e4ce223657..fac95ecfff 100644 --- a/src/util/virnetdevtap.c +++ b/src/util/virnetdevtap.c @@ -42,6 +42,40 @@ #define VIR_FROM_THIS VIR_FROM_NONE +/** + * virNetDevTapGetName: + * @tapfd: a tun/tap file descriptor + * @ifname: a pointer that will receive the interface name + * + * Retrieve the interface name given a file descriptor for a tun/tap + * interface. + * + * Returns 0 if the interface name is successfully queried, -1 otherwise + */ +int +virNetDevTapGetName(int tapfd, char **ifname) +{ +#ifdef TUNGETIFF + struct ifreq ifr; + + if (ioctl(tapfd, TUNGETIFF, &ifr) < 0) { + virReportSystemError(errno, "%s", + _("Unable to query tap interface name")); + return -1; + } + + *ifname = strdup(ifr.ifr_name); + if (*ifname == NULL) { + virReportOOMError(); + return -1; + } + return 0; +#else + return -1; +#endif +} + + /** * virNetDevProbeVnetHdr: * @tapfd: a tun/tap file descriptor diff --git a/src/util/virnetdevtap.h b/src/util/virnetdevtap.h index 980db61e5e..6bfc80c575 100644 --- a/src/util/virnetdevtap.h +++ b/src/util/virnetdevtap.h @@ -35,6 +35,9 @@ int virNetDevTapCreate(char **ifname, int virNetDevTapDelete(const char *ifname) ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; +int virNetDevTapGetName(int tapfd, char **ifname) + ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; + typedef enum { VIR_NETDEV_TAP_CREATE_NONE = 0, /* Bring the interface up */