
On 23.01.2013 17:41, John Eckersberg wrote:
I'm running the following test program, and it works as written with a blocking stream. Inside the guest I'm running:
[root@f17-minimal ~]# socat /usr/share/dict/words /dev/virtio-ports/org.libguestfs.channel.0
As expected on the client side, I get all the words dumped. However if I swap the virStreamNew lines and instead use the non-blocking stream, the virStreamRecv call always returns -2.
From http://libvirt.org/internals/rpc.html#apiclientdispatch, I see:
When no thread is performing any RPC method call, or sending stream data there is still a need to monitor the socket for incoming I/O related to asynchronous events, or stream data receipt. For this task, a watch is registered with the event loop which triggers whenever the socket is readable. This watch is automatically disabled whenever any other thread grabs the buck, and re-enabled when the buck is released.
If I understand that correctly, shouldn't the watch be responsible for reading the stream data in this case? Or am I just completely missing something?
----- #include <libvirt.h>
int main() { virConnectPtr conn; virDomainPtr dom; virStreamPtr st; char buf[1024+1]; int got = 0;
conn = virConnectOpen("qemu+ssh://root@localhost/system"); dom = virDomainLookupByName(conn, "f17-minimal"); /* st = virStreamNew(conn, VIR_STREAM_NONBLOCK); */ st = virStreamNew(conn, 0); virDomainOpenChannel(dom, "org.libguestfs.channel.0", st, 0);
while (1) { got = virStreamRecv(st, buf, 1024);
switch (got) { case 0: goto finish; case -1: goto free; case -2: puts("Retrying"); sleep(1); continue; }
buf[got] = '\0'; puts(buf); }
finish: virStreamFinish(st); free: virStreamFree(st);
return 0; }
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
In order to use VIR_STREAM_NONBLOCK, you need to call virStreamEventAddCallback() which registers your stream in libvirtd event loop so data is sent to you as read from chardev's socket. However, you need a client event loop then. So the simple program should look like this [1]. Michal 1: http://pastebin.com/JffxfSmg