On Tue, Sep 23, 2008 at 04:56:45PM -0400, Cole Robinson wrote:
if ((ret = virExec(conn, argv, NULL, NULL,
- &childpid, -1, NULL, NULL, VIR_EXEC_NONE)) < 0)
+ &childpid, -1, &outfd, &errfd, VIR_EXEC_NONE)) <
0)
return ret;
while ((ret = waitpid(childpid, &exitstatus, 0) == -1) && errno ==
EINTR);
@@ -418,16 +430,31 @@ virRun(virConnectPtr conn,
return -1;
}
+ /* Log command output */
+ if (outfd) {
+ ret = saferead(outfd, out, sizeof(out)-1);
+ err[ret < 0 ? 0 : ret] = '\0';
+ if (*out)
+ DEBUG("Command stdout: %s", out);
+ }
+ if (errfd) {
+ ret = saferead(errfd, err, sizeof(err)-1);
+ err[ret < 0 ? 0 : ret] = '\0';
+ if (*err)
+ DEBUG("Command stderr: %s", err);
+ }
+
I'm sure this works in tests, but I don't think it'll work reliably
all the time.
What happens if the command pauses for some time before sending output
to stdout/stderr? You need to integrate these in the event loop,
which is going to make everything a lot more complicated.
Rich.
--
Richard Jones, Emerging Technologies, Red Hat
http://et.redhat.com/~rjones
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://et.redhat.com/~rjones/virt-top