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