
On 05/10/2011 02:07 PM, Cole Robinson wrote:
@@ -1372,6 +1371,9 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool, int maxReg = 0, i, j; int totgroups = 0, ngroup = 0, maxvars = 0; char **groups; + virCommandPtr cmd = NULL; + const char * const *tmp;
No need for tmp...
+ pid_t pid = -1;
/* Compile all regular expressions */ if (VIR_ALLOC_N(reg, nregex) < 0) { @@ -1408,10 +1410,14 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool, goto cleanup; }
+ cmd = virCommandNew(prog[0]); + tmp = prog; + while (*(++tmp)) { + virCommandAddArg(cmd, *tmp); + }
...if you replace this with virCommandNewArgs(prog).
+cleanup: + if (pid > 0 && virCommandWait(cmd, outexit) < 0) + ret = -1;
- cleanup: if (groups) { for (j = 0 ; j < totgroups ; j++) VIR_FREE(groups[j]); @@ -1478,29 +1486,7 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool, VIR_FORCE_FCLOSE(list); VIR_FORCE_CLOSE(fd);
- while ((err = waitpid(child, &exitstatus, 0) == -1) && errno == EINTR); - - /* Don't bother checking exit status if we already failed */ - if (failed) - return -1; - - if (err == -1) { - virReportSystemError(errno, - _("failed to wait for command '%s'"), - prog[0]); - return -1; - } else { - if (WIFEXITED(exitstatus)) { - if (outexit != NULL) - *outexit = WEXITSTATUS(exitstatus); - } else { - virStorageReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("command did not exit cleanly")); - return -1; - } - } - - return 0; + return ret;
This leaks the memory for cmd; you still need a call to virCommandFree(cmd) somewhere in the cleanup.
@@ -1540,9 +1527,14 @@ virStorageBackendRunProgNul(virStoragePoolObjPtr pool, for (i = 0; i < n_columns; i++) v[i] = NULL;
- /* Run the program and capture its output */ - if (virExec(prog, NULL, NULL, - &child, -1, &fd, NULL, VIR_EXEC_NONE) < 0) { + cmd = virCommandNew(prog[0]); + tmp = prog; + while (*(++tmp)) { + virCommandAddArg(cmd, *tmp); + }
Again, virCommandNewArgs is more compact. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org