Il 21/11/2013 10:11, Lei Li ha scritto:
> + /*
> + * recvmsg is called here to catch the control message for
> + * the exchange of PIPE file descriptor until it is received.
> + */
> + len = recvmsg(s->sockfd, &msg, 0);
> + if (len != -1) {
> + if (unix_msgfd_lookup(s, &msg) > 0) {
> + pipefd_passed = 1;
> + /*
> + * Do not count one byte taken by the PIPE file
> + * descriptor.
> + */
> + len--;
I think adding a byte in the middle of the stream is not reliable.
Rather, you should transmit the socket always at the same place, for
example in the first call of qemu_local_save_ram, after it has written
the 64-bit field.
The matching code in qemu_local_ram_load will be like this:
static int qemu_local_ram_load(QEMUFile *f, void *opaque,
uint64_t flags)
{
QEMUFileLocal *s = opaque;
ram_addr_t addr;
struct iovec iov;
ssize_t ret = -EINVAL;
if (!s->pipefd_received) {
/*
* send_pipefd was called at this point, and it wrote one byte
* to the stream.
*/
qemu_get_byte(s);
s->pipefd_received = true;
}
if (pipefd_passed) {
...
}
return -EINVAL;
}
Also, please move pipefd_passed within QEMUFileLocal.
Thanks,
Paolo