[libvirt] [PATCHv2 3/8] Switch virCommandRunRegex to use virStringSplit

Ján Tomko jtomko at redhat.com
Wed Mar 19 15:52:28 UTC 2014


Instead of running the command asynchronously and reading the output
via fgets, let virCommand collect the output and split it with
virStringSplit.
---
 src/util/vircommand.c | 41 +++++++++++++++++++----------------------
 1 file changed, 19 insertions(+), 22 deletions(-)

diff --git a/src/util/vircommand.c b/src/util/vircommand.c
index 3f98eb8..8250634 100644
--- a/src/util/vircommand.c
+++ b/src/util/vircommand.c
@@ -2779,15 +2779,16 @@ virCommandRunRegex(virCommandPtr cmd,
                    void *data,
                    const char *prefix)
 {
-    int fd = -1, err, ret = -1;
-    FILE *list = NULL;
+    int err;
     regex_t *reg;
     regmatch_t *vars = NULL;
-    char line[1024];
     int maxReg = 0;
-    size_t i, j;
+    size_t i, j, k;
     int totgroups = 0, ngroup = 0, maxvars = 0;
     char **groups;
+    char *outbuf = NULL;
+    char **lines = NULL;
+    int ret = -1;
 
     /* Compile all regular expressions */
     if (VIR_ALLOC_N(reg, nregex) < 0)
@@ -2818,29 +2819,27 @@ virCommandRunRegex(virCommandPtr cmd,
     if (VIR_ALLOC_N(vars, maxvars+1) < 0)
         goto cleanup;
 
-    virCommandSetOutputFD(cmd, &fd);
-    if (virCommandRunAsync(cmd, NULL) < 0) {
+    virCommandSetOutputBuffer(cmd, &outbuf);
+    if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
-    }
 
-    if ((list = VIR_FDOPEN(fd, "r")) == NULL) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       "%s", _("cannot read fd"));
+    if (!outbuf) {
+        /* no output */
+        ret = 0;
         goto cleanup;
     }
 
-    while (fgets(line, sizeof(line), list) != NULL) {
+    if (!(lines = virStringSplit(outbuf, "\n", 0)))
+        goto cleanup;
+
+    for (k = 0; lines[k]; k++) {
         char *p = NULL;
-        /* Strip trailing newline */
-        int len = strlen(line);
-        if (len && line[len-1] == '\n')
-            line[len-1] = '\0';
 
         /* ignore any command prefix */
         if (prefix)
-            p = STRSKIP(line, prefix);
+            p = STRSKIP(lines[k], prefix);
         if (!p)
-            p = line;
+            p = lines[k];
 
         for (i = 0; i <= maxReg && i < nregex; i++) {
             if (regexec(&reg[i], p, nvars[i]+1, vars, 0) == 0) {
@@ -2872,8 +2871,10 @@ virCommandRunRegex(virCommandPtr cmd,
         }
     }
 
-    ret = virCommandWait(cmd, NULL);
+    ret = 0;
 cleanup:
+    virStringFreeList(lines);
+    VIR_FREE(outbuf);
     if (groups) {
         for (j = 0; j < totgroups; j++)
             VIR_FREE(groups[j]);
@@ -2885,10 +2886,6 @@ cleanup:
         regfree(&reg[i]);
 
     VIR_FREE(reg);
-
-    VIR_FORCE_FCLOSE(list);
-    VIR_FORCE_CLOSE(fd);
-
     return ret;
 }
 
-- 
1.8.3.2




More information about the libvir-list mailing list