[libvirt] [PATCH 2/6] virNetDevMacVLanTapOpen: Slightly rework

Michal Privoznik mprivozn at redhat.com
Fri Dec 4 12:30:58 UTC 2015


There are few outdated things. Firstly, we don't need to undergo
the torture of fopen, fscanf and fclose when we have nice wrapper
over that: virFileReadAll. Secondly, we can use dynamically
allocated buffer for the interface index.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/util/virnetdevmacvlan.c | 29 +++++++++--------------------
 1 file changed, 9 insertions(+), 20 deletions(-)

diff --git a/src/util/virnetdevmacvlan.c b/src/util/virnetdevmacvlan.c
index 9384b9f..c1a5f0f 100644
--- a/src/util/virnetdevmacvlan.c
+++ b/src/util/virnetdevmacvlan.c
@@ -237,40 +237,28 @@ int virNetDevMacVLanTapOpen(const char *ifname,
                             int retries)
 {
     int ret = -1;
-    FILE *file = NULL;
     char *path;
     int ifindex;
-    char tapname[50];
+    char *tapname = NULL;
+    char *buf = NULL;
+    char *c;
     int tapfd;
 
     if (virNetDevSysfsFile(&path, ifname, "ifindex") < 0)
         return -1;
 
-    file = fopen(path, "r");
-
-    if (!file) {
-        virReportSystemError(errno,
-                             _("cannot open macvtap file %s to determine "
-                               "interface index"), path);
+    if (virFileReadAll(path, sizeof(buf), &buf) < 0)
         goto cleanup;
-    }
 
-    if (fscanf(file, "%d", &ifindex) != 1) {
+    if (virStrToLong_i(buf, &c, 10, &ifindex) < 0 || *c != '\n') {
         virReportSystemError(errno,
                              "%s", _("cannot determine macvtap's tap device "
-                             "interface index"));
+                                     "interface index"));
         goto cleanup;
     }
 
-    VIR_FORCE_FCLOSE(file);
-
-    if (snprintf(tapname, sizeof(tapname),
-                 "/dev/tap%d", ifindex) >= sizeof(tapname)) {
-        virReportSystemError(errno,
-                             "%s",
-                             _("internal buffer for tap device is too small"));
+    if (virAsprintf(&tapname, "/dev/tap%d", ifindex) < 0)
         goto cleanup;
-    }
 
     while (1) {
         /* may need to wait for udev to be done */
@@ -292,7 +280,8 @@ int virNetDevMacVLanTapOpen(const char *ifname,
     ret = tapfd;
  cleanup:
     VIR_FREE(path);
-    VIR_FORCE_FCLOSE(file);
+    VIR_FREE(tapname);
+    VIR_FREE(buf);
     return ret;
 }
 
-- 
2.4.10




More information about the libvir-list mailing list