2 * Copyright (C) 2009-2011 Red Hat Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #define _BSD_SOURCE /* for mkdtemp, usleep */
34 #include <sys/select.h>
38 #include <rpc/types.h>
45 #ifdef HAVE_SYS_TYPES_H
46 #include <sys/types.h>
49 #ifdef HAVE_SYS_WAIT_H
53 #ifdef HAVE_SYS_SOCKET_H
54 #include <sys/socket.h>
61 #include <arpa/inet.h>
62 #include <netinet/in.h>
65 #include "glthread/lock.h"
66 #include "ignore-value.h"
69 #include "guestfs-internal.h"
70 #include "guestfs-internal-actions.h"
71 #include "guestfs_protocol.h"
73 /* Size of guestfs_progress message on the wire. */
74 #define PROGRESS_MESSAGE_SIZE 24
76 /* This is the code used to send and receive RPC messages and (for
77 * certain types of message) to perform file transfers. This code is
78 * driven from the generated actions (src/actions.c). There
79 * are five different cases to consider:
81 * (1) A non-daemon function. There is no RPC involved at all, it's
82 * all handled inside the library.
84 * (2) A simple RPC (eg. "mount"). We write the request, then read
85 * the reply. The sequence of calls is:
92 * (3) An RPC with FileOut parameters (eg. "upload"). We write the
93 * request, then write the file(s), then read the reply. The sequence
98 * guestfs___send_file (possibly multiple times)
102 * (4) An RPC with FileIn parameters (eg. "download"). We write the
103 * request, then read the reply, then read the file(s). The sequence
109 * guestfs___recv_file (possibly multiple times)
112 * (5) Both FileOut and FileIn parameters. There are no calls like
113 * this in the current API, but they would be implemented as a
114 * combination of cases (3) and (4).
116 * During all writes and reads, we also select(2) on qemu stdout
117 * looking for messages (guestfsd stderr and guest kernel dmesg), and
118 * anything received is passed up through the log_message_cb. This is
119 * also the reason why all the sockets are non-blocking. We also have
120 * to check for EOF (qemu died). All of this is handled by the
121 * functions send_to_daemon and recv_from_daemon.
124 /* This is only used on the debug path, to generate a one-line
125 * printable summary of a protocol message. 'workspace' is scratch
126 * space used to format the message, and it must be at least
127 * MAX_MESSAGE_SUMMARY bytes in size.
129 #define MAX_MESSAGE_SUMMARY 200 /* >= 5 * (4 * 3 + 2) + a few bytes overhead */
132 xwrite (int fd, const void *v_buf, size_t len)
134 const char *buf = v_buf;
138 r = write (fd, buf, len);
150 message_summary (const void *buf, size_t n, char *workspace)
152 const unsigned char *cbuf = buf;
157 /* Print only up to 5 x 32 bits of the message. That is enough to
158 * cover the message length, and the first four fields of the
159 * message header (prog, vers, proc, direction).
167 sprintf (p, "%02x ", cbuf[i]);
185 guestfs___set_busy (guestfs_h *g)
187 if (g->state != READY) {
188 error (g, _("guestfs_set_busy: called when in state %d != READY"),
197 guestfs___end_busy (guestfs_h *g)
211 error (g, _("guestfs_end_busy: called when in state %d"), g->state);
217 /* This is called if we detect EOF, ie. qemu died. */
219 child_cleanup (guestfs_h *g)
221 debug (g, "child_cleanup: %p: child process died", g);
223 /*if (g->pid > 0) kill (g->pid, SIGTERM);*/
224 if (g->recoverypid > 0) kill (g->recoverypid, 9);
225 waitpid (g->pid, NULL, 0);
226 if (g->recoverypid > 0) waitpid (g->recoverypid, NULL, 0);
227 if (g->fd[0] >= 0) close (g->fd[0]);
228 if (g->fd[1] >= 0) close (g->fd[1]);
235 memset (&g->launch_t, 0, sizeof g->launch_t);
237 guestfs___call_callbacks_void (g, GUESTFS_EVENT_SUBPROCESS_QUIT);
241 read_log_message_or_eof (guestfs_h *g, int fd, int error_if_eof)
247 debug (g, "read_log_message_or_eof: %p g->state = %d, fd = %d",
251 /* QEMU's console emulates a 16550A serial port. The real 16550A
252 * device has a small FIFO buffer (16 bytes) which means here we see
253 * lots of small reads of 1-16 bytes in length, usually single
254 * bytes. Sleeping here for a very brief period groups reads
255 * together (so we usually get a few lines of output at once) and
256 * improves overall throughput, as well as making the event
257 * interface a bit more sane for callers. With a virtio-serial
258 * based console (not yet implemented) we may be able to remove
263 n = read (fd, buf, sizeof buf);
265 /* Hopefully this indicates the qemu child process has died. */
269 /* We weren't expecting eof here (called from launch) so place
270 * something in the error buffer. RHBZ#588851.
272 error (g, "child process died unexpectedly");
278 if (errno == EINTR || errno == EAGAIN)
285 /* It's an actual log message, send it upwards if anyone is listening. */
286 guestfs___call_callbacks_message (g, GUESTFS_EVENT_APPLIANCE, buf, n);
288 /* This is a gross hack. See the comment above
289 * guestfs___launch_send_progress.
291 if (g->state == LAUNCHING) {
292 const char *sentinel;
295 sentinel = "Linux version"; /* kernel up */
296 len = strlen (sentinel);
297 if (memmem (buf, n, sentinel, len) != NULL)
298 guestfs___launch_send_progress (g, 6);
300 sentinel = "Starting /init script"; /* /init running */
301 len = strlen (sentinel);
302 if (memmem (buf, n, sentinel, len) != NULL)
303 guestfs___launch_send_progress (g, 9);
309 /* Read 'n' bytes, setting the socket to blocking temporarily so
310 * that we really read the number of bytes requested.
311 * Returns: 0 == EOF while reading
312 * -1 == error, error() function has been called
313 * n == read 'n' bytes in full
316 really_read_from_socket (guestfs_h *g, int sock, char *buf, size_t n)
322 /* Set socket to blocking. */
323 flags = fcntl (sock, F_GETFL);
325 perrorf (g, "fcntl");
328 if (fcntl (sock, F_SETFL, flags & ~O_NONBLOCK) == -1) {
329 perrorf (g, "fcntl");
335 r = read (sock, &buf[got], n-got);
345 /* Restore original socket flags. */
346 if (fcntl (sock, F_SETFL, flags) == -1) {
347 perrorf (g, "fcntl");
351 return (ssize_t) got;
354 /* Convenient wrapper to generate a progress message callback. */
356 guestfs___progress_message_callback (guestfs_h *g,
357 const guestfs_progress *message)
361 array[0] = message->proc;
362 array[1] = message->serial;
363 array[2] = message->position;
364 array[3] = message->total;
366 guestfs___call_callbacks_array (g, GUESTFS_EVENT_PROGRESS,
367 array, sizeof array / sizeof array[0]);
371 check_for_daemon_cancellation_or_eof (guestfs_h *g, int fd)
373 char summary[MAX_MESSAGE_SUMMARY];
379 n = really_read_from_socket (g, fd, buf, 4);
383 /* Hopefully this indicates the qemu child process has died. */
388 debug (g, "check_for_daemon_cancellation_or_eof: %s",
389 message_summary (buf, 4, summary));
391 xdrmem_create (&xdr, buf, 4, XDR_DECODE);
392 xdr_uint32_t (&xdr, &flag);
395 /* Read and process progress messages that happen during FileIn. */
396 if (flag == GUESTFS_PROGRESS_FLAG) {
397 char buf[PROGRESS_MESSAGE_SIZE];
399 n = really_read_from_socket (g, fd, buf, PROGRESS_MESSAGE_SIZE);
407 if (g->state == BUSY) {
408 guestfs_progress message;
410 xdrmem_create (&xdr, buf, PROGRESS_MESSAGE_SIZE, XDR_DECODE);
411 xdr_guestfs_progress (&xdr, &message);
414 guestfs___progress_message_callback (g, &message);
420 if (flag != GUESTFS_CANCEL_FLAG) {
421 error (g, _("check_for_daemon_cancellation_or_eof: read 0x%x from daemon, expected 0x%x\n"),
422 flag, GUESTFS_CANCEL_FLAG);
429 /* This writes the whole N bytes of BUF to the daemon socket.
431 * If the whole write is successful, it returns 0.
432 * If there was an error, it returns -1.
433 * If the daemon sent a cancellation message, it returns -2.
435 * It also checks qemu stdout for log messages and passes those up
436 * through log_message_cb.
438 * It also checks for EOF (qemu died) and passes that up through the
439 * child_cleanup function above.
442 guestfs___send_to_daemon (guestfs_h *g, const void *v_buf, size_t n)
444 const char *buf = v_buf;
447 char summary[MAX_MESSAGE_SUMMARY];
449 debug (g, "send_to_daemon: %zu bytes: %s", n,
450 message_summary (v_buf, n, summary));
455 if (g->fd[1] >= 0) /* Read qemu stdout for log messages & EOF. */
456 FD_SET (g->fd[1], &rset);
457 FD_SET (g->sock, &rset); /* Read socket for cancellation & EOF. */
458 FD_SET (g->sock, &wset); /* Write to socket to send the data. */
460 int max_fd = MAX (g->sock, g->fd[1]);
465 int r = select (max_fd+1, &rset2, &wset2, NULL, NULL);
467 if (errno == EINTR || errno == EAGAIN)
469 perrorf (g, "select");
473 if (g->fd[1] >= 0 && FD_ISSET (g->fd[1], &rset2)) {
474 if (read_log_message_or_eof (g, g->fd[1], 0) == -1)
477 if (FD_ISSET (g->sock, &rset2)) {
478 r = check_for_daemon_cancellation_or_eof (g, g->sock);
482 /* Daemon sent cancel message. But to maintain
483 * synchronization we must write out the remainder of the
484 * write buffer before we return (RHBZ#576879).
486 if (xwrite (g->sock, buf, n) == -1) {
487 perrorf (g, "write");
490 return -2; /* cancelled */
493 if (FD_ISSET (g->sock, &wset2)) {
494 r = write (g->sock, buf, n);
496 if (errno == EINTR || errno == EAGAIN)
498 perrorf (g, "write");
499 if (errno == EPIPE) /* Disconnected from guest (RHBZ#508713). */
511 /* This reads a single message, file chunk, launch flag or
512 * cancellation flag from the daemon. If something was read, it
513 * returns 0, otherwise -1.
515 * Both size_rtn and buf_rtn must be passed by the caller as non-NULL.
517 * *size_rtn returns the size of the returned message or it may be
518 * GUESTFS_LAUNCH_FLAG or GUESTFS_CANCEL_FLAG.
520 * *buf_rtn is returned containing the message (if any) or will be set
521 * to NULL. *buf_rtn must be freed by the caller.
523 * It also checks qemu stdout for log messages and passes those up
524 * through log_message_cb.
526 * It also checks for EOF (qemu died) and passes that up through the
527 * child_cleanup function above.
529 * Progress notifications are handled transparently by this function.
530 * If the callback exists, it is called. The caller of this function
531 * will not see GUESTFS_PROGRESS_FLAG.
535 unexpected_end_of_file_from_daemon_error (guestfs_h *g)
537 #define UNEXPEOF_ERROR "unexpected end of file when reading from daemon.\n"
538 #define UNEXPEOF_TEST_TOOL \
539 "Or you can run 'libguestfs-test-tool' and post the complete output into\n" \
540 "a bug report or message to the libguestfs mailing list."
542 error (g, _(UNEXPEOF_ERROR
543 "This usually means the libguestfs appliance failed to start up. Please\n"
544 "enable debugging (LIBGUESTFS_DEBUG=1) and rerun the command, then look at\n"
545 "the debug messages output prior to this error.\n"
546 UNEXPEOF_TEST_TOOL));
548 error (g, _(UNEXPEOF_ERROR
549 "See earlier debug messages.\n"
550 UNEXPEOF_TEST_TOOL));
554 guestfs___recv_from_daemon (guestfs_h *g, uint32_t *size_rtn, void **buf_rtn)
556 char summary[MAX_MESSAGE_SUMMARY];
561 if (g->fd[1] >= 0) /* Read qemu stdout for log messages & EOF. */
562 FD_SET (g->fd[1], &rset);
563 FD_SET (g->sock, &rset); /* Read socket for data & EOF. */
565 int max_fd = MAX (g->sock, g->fd[1]);
571 /* nr is the size of the message, but we prime it as -4 because we
572 * have to read the message length word first.
577 ssize_t message_size =
578 *size_rtn != GUESTFS_PROGRESS_FLAG ?
579 *size_rtn : PROGRESS_MESSAGE_SIZE;
580 if (nr >= message_size)
584 int r = select (max_fd+1, &rset2, NULL, NULL, NULL);
586 if (errno == EINTR || errno == EAGAIN)
588 perrorf (g, "select");
594 if (g->fd[1] >= 0 && FD_ISSET (g->fd[1], &rset2)) {
595 if (read_log_message_or_eof (g, g->fd[1], 0) == -1) {
601 if (FD_ISSET (g->sock, &rset2)) {
602 if (nr < 0) { /* Have we read the message length word yet? */
603 r = read (g->sock, lenbuf+nr+4, -nr);
605 if (errno == EINTR || errno == EAGAIN)
609 /* Under some circumstances we see "Connection reset by peer"
610 * here when the child dies suddenly. Catch this and call
611 * the cleanup function, same as for EOF.
613 if (err == ECONNRESET)
618 unexpected_end_of_file_from_daemon_error (g);
624 if (nr < 0) /* Still not got the whole length word. */
628 xdrmem_create (&xdr, lenbuf, 4, XDR_DECODE);
629 xdr_uint32_t (&xdr, size_rtn);
632 /* *size_rtn changed, recalculate message_size */
634 *size_rtn != GUESTFS_PROGRESS_FLAG ?
635 *size_rtn : PROGRESS_MESSAGE_SIZE;
637 if (*size_rtn == GUESTFS_LAUNCH_FLAG) {
638 if (g->state != LAUNCHING)
639 error (g, _("received magic signature from guestfsd, but in state %d"),
643 guestfs___call_callbacks_void (g, GUESTFS_EVENT_LAUNCH_DONE);
645 debug (g, "recv_from_daemon: received GUESTFS_LAUNCH_FLAG");
648 else if (*size_rtn == GUESTFS_CANCEL_FLAG) {
649 debug (g, "recv_from_daemon: received GUESTFS_CANCEL_FLAG");
652 else if (*size_rtn == GUESTFS_PROGRESS_FLAG)
654 /* If this happens, it's pretty bad and we've probably lost
657 else if (*size_rtn > GUESTFS_MESSAGE_MAX) {
658 error (g, _("message length (%u) > maximum possible size (%d)"),
659 (unsigned) *size_rtn, GUESTFS_MESSAGE_MAX);
663 /* Allocate the complete buffer, size now known. */
664 *buf_rtn = safe_malloc (g, message_size);
668 size_t sizetoread = message_size - nr;
669 if (sizetoread > BUFSIZ) sizetoread = BUFSIZ;
671 r = read (g->sock, (char *) (*buf_rtn) + nr, sizetoread);
673 if (errno == EINTR || errno == EAGAIN)
681 unexpected_end_of_file_from_daemon_error (g);
691 /* Got the full message, caller can start processing it. */
692 #ifdef ENABLE_PACKET_DUMP
696 for (i = 0; i < nr; i += 16) {
697 printf ("%04zx: ", i);
698 for (j = i; j < MIN (i+16, nr); ++j)
699 printf ("%02x ", (*(unsigned char **)buf_rtn)[j]);
700 for (; j < i+16; ++j)
703 for (j = i; j < MIN (i+16, nr); ++j)
704 if (c_isprint ((*(char **)buf_rtn)[j]))
705 printf ("%c", (*(char **)buf_rtn)[j]);
708 for (; j < i+16; ++j)
715 if (*size_rtn == GUESTFS_PROGRESS_FLAG) {
716 if (g->state == BUSY) {
717 guestfs_progress message;
719 xdrmem_create (&xdr, *buf_rtn, PROGRESS_MESSAGE_SIZE, XDR_DECODE);
720 xdr_guestfs_progress (&xdr, &message);
723 guestfs___progress_message_callback (g, &message);
729 /* Process next message. */
730 return guestfs___recv_from_daemon (g, size_rtn, buf_rtn);
733 debug (g, "recv_from_daemon: %" PRIu32 " bytes: %s", *size_rtn,
734 message_summary (*buf_rtn, *size_rtn, summary));
739 /* This is very much like recv_from_daemon above, but g->sock is
740 * a listening socket and we are accepting a new connection on
741 * that socket instead of reading anything. Returns the newly
745 guestfs___accept_from_daemon (guestfs_h *g)
749 debug (g, "accept_from_daemon: %p g->state = %d", g, g->state);
753 if (g->fd[1] >= 0) /* Read qemu stdout for log messages & EOF. */
754 FD_SET (g->fd[1], &rset);
755 FD_SET (g->sock, &rset); /* Read socket for accept. */
757 int max_fd = MAX (g->sock, g->fd[1]);
761 /* If the qemu process has died, clean up the zombie (RHBZ#579155).
762 * By partially polling in the select below we ensure that this
763 * function will be called eventually.
765 waitpid (g->pid, NULL, WNOHANG);
769 struct timeval tv = { .tv_sec = 1, .tv_usec = 0 };
770 int r = select (max_fd+1, &rset2, NULL, NULL, &tv);
772 if (errno == EINTR || errno == EAGAIN)
774 perrorf (g, "select");
778 if (g->fd[1] >= 0 && FD_ISSET (g->fd[1], &rset2)) {
779 if (read_log_message_or_eof (g, g->fd[1], 1) == -1)
782 if (FD_ISSET (g->sock, &rset2)) {
783 sock = accept (g->sock, NULL, NULL);
785 if (errno == EINTR || errno == EAGAIN)
787 perrorf (g, "accept");
797 guestfs___send (guestfs_h *g, int proc_nr,
798 uint64_t progress_hint, uint64_t optargs_bitmask,
799 xdrproc_t xdrp, char *args)
801 struct guestfs_message_header hdr;
804 int serial = g->msg_next_serial++;
809 if (g->state != BUSY) {
810 error (g, _("guestfs___send: state %d != BUSY"), g->state);
814 /* We have to allocate this message buffer on the heap because
815 * it is quite large (although will be mostly unused). We
816 * can't allocate it on the stack because in some environments
817 * we have quite limited stack space available, notably when
818 * running in the JVM.
820 msg_out = safe_malloc (g, GUESTFS_MESSAGE_MAX + 4);
821 xdrmem_create (&xdr, msg_out + 4, GUESTFS_MESSAGE_MAX, XDR_ENCODE);
823 /* Serialize the header. */
824 hdr.prog = GUESTFS_PROGRAM;
825 hdr.vers = GUESTFS_PROTOCOL_VERSION;
827 hdr.direction = GUESTFS_DIRECTION_CALL;
829 hdr.status = GUESTFS_STATUS_OK;
830 hdr.progress_hint = progress_hint;
831 hdr.optargs_bitmask = optargs_bitmask;
833 if (!xdr_guestfs_message_header (&xdr, &hdr)) {
834 error (g, _("xdr_guestfs_message_header failed"));
838 /* Serialize the args. If any, because some message types
839 * have no parameters.
842 if (!(*xdrp) (&xdr, args)) {
843 error (g, _("dispatch failed to marshal args"));
848 /* Get the actual length of the message, resize the buffer to match
849 * the actual length, and write the length word at the beginning.
851 len = xdr_getpos (&xdr);
854 msg_out = safe_realloc (g, msg_out, len + 4);
855 msg_out_size = len + 4;
857 xdrmem_create (&xdr, msg_out, 4, XDR_ENCODE);
858 xdr_uint32_t (&xdr, &len);
861 r = guestfs___send_to_daemon (g, msg_out, msg_out_size);
862 if (r == -2) /* Ignore stray daemon cancellations. */
875 static int send_file_chunk (guestfs_h *g, int cancel, const char *buf, size_t len);
876 static int send_file_data (guestfs_h *g, const char *buf, size_t len);
877 static int send_file_cancellation (guestfs_h *g);
878 static int send_file_complete (guestfs_h *g);
884 * -2 daemon cancelled (we must read the error message)
887 guestfs___send_file (guestfs_h *g, const char *filename)
889 char buf[GUESTFS_MAX_CHUNK_SIZE];
894 fd = open (filename, O_RDONLY);
896 perrorf (g, "open: %s", filename);
897 send_file_cancellation (g);
901 /* Send file in chunked encoding. */
902 while (!g->user_cancel) {
903 r = read (fd, buf, sizeof buf);
904 if (r == -1 && (errno == EINTR || errno == EAGAIN))
907 err = send_file_data (g, buf, r);
909 if (err == -2) /* daemon sent cancellation */
910 send_file_cancellation (g);
916 perrorf (g, "read: %s", filename);
917 send_file_cancellation (g);
921 if (g->user_cancel) {
922 error (g, _("operation cancelled by user"));
923 g->last_errnum = EINTR;
924 send_file_cancellation (g);
928 /* End of file, but before we send that, we need to close
929 * the file and check for errors.
931 if (close (fd) == -1) {
932 perrorf (g, "close: %s", filename);
933 send_file_cancellation (g);
937 return send_file_complete (g);
940 /* Send a chunk of file data. */
942 send_file_data (guestfs_h *g, const char *buf, size_t len)
944 return send_file_chunk (g, 0, buf, len);
947 /* Send a cancellation message. */
949 send_file_cancellation (guestfs_h *g)
951 return send_file_chunk (g, 1, NULL, 0);
954 /* Send a file complete chunk. */
956 send_file_complete (guestfs_h *g)
959 return send_file_chunk (g, 0, buf, 0);
963 send_file_chunk (guestfs_h *g, int cancel, const char *buf, size_t buflen)
972 if (g->state != BUSY) {
973 error (g, _("send_file_chunk: state %d != READY"), g->state);
977 /* Allocate the chunk buffer. Don't use the stack to avoid
978 * excessive stack usage and unnecessary copies.
980 msg_out = safe_malloc (g, GUESTFS_MAX_CHUNK_SIZE + 4 + 48);
981 xdrmem_create (&xdr, msg_out + 4, GUESTFS_MAX_CHUNK_SIZE + 48, XDR_ENCODE);
983 /* Serialize the chunk. */
984 chunk.cancel = cancel;
985 chunk.data.data_len = buflen;
986 chunk.data.data_val = (char *) buf;
988 if (!xdr_guestfs_chunk (&xdr, &chunk)) {
989 error (g, _("xdr_guestfs_chunk failed (buf = %p, buflen = %zu)"),
995 len = xdr_getpos (&xdr);
998 /* Reduce the size of the outgoing message buffer to the real length. */
999 msg_out = safe_realloc (g, msg_out, len + 4);
1000 msg_out_size = len + 4;
1002 xdrmem_create (&xdr, msg_out, 4, XDR_ENCODE);
1003 xdr_uint32_t (&xdr, &len);
1005 r = guestfs___send_to_daemon (g, msg_out, msg_out_size);
1007 /* Did the daemon send a cancellation message? */
1009 debug (g, "got daemon cancellation");
1025 /* Receive a reply. */
1027 guestfs___recv (guestfs_h *g, const char *fn,
1028 guestfs_message_header *hdr,
1029 guestfs_message_error *err,
1030 xdrproc_t xdrp, char *ret)
1038 r = guestfs___recv_from_daemon (g, &size, &buf);
1042 /* This can happen if a cancellation happens right at the end
1043 * of us sending a FileIn parameter to the daemon. Discard. The
1044 * daemon should send us an error message next.
1046 if (size == GUESTFS_CANCEL_FLAG)
1049 if (size == GUESTFS_LAUNCH_FLAG) {
1050 error (g, "%s: received unexpected launch flag from daemon when expecting reply", fn);
1054 xdrmem_create (&xdr, buf, size, XDR_DECODE);
1056 if (!xdr_guestfs_message_header (&xdr, hdr)) {
1057 error (g, "%s: failed to parse reply header", fn);
1062 if (hdr->status == GUESTFS_STATUS_ERROR) {
1063 if (!xdr_guestfs_message_error (&xdr, err)) {
1064 error (g, "%s: failed to parse reply error", fn);
1070 if (xdrp && ret && !xdrp (&xdr, ret)) {
1071 error (g, "%s: failed to parse reply", fn);
1083 /* Same as guestfs___recv, but it discards the reply message. */
1085 guestfs___recv_discard (guestfs_h *g, const char *fn)
1092 r = guestfs___recv_from_daemon (g, &size, &buf);
1097 /* This can happen if a cancellation happens right at the end
1098 * of us sending a FileIn parameter to the daemon. Discard. The
1099 * daemon should send us an error message next.
1101 if (size == GUESTFS_CANCEL_FLAG)
1104 if (size == GUESTFS_LAUNCH_FLAG) {
1105 error (g, "%s: received unexpected launch flag from daemon when expecting reply", fn);
1112 /* Receive a file. */
1114 /* Returns -1 = error, 0 = EOF, > 0 = more data */
1115 static ssize_t receive_file_data (guestfs_h *g, void **buf);
1118 guestfs___recv_file (guestfs_h *g, const char *filename)
1125 fd = open (filename, O_WRONLY|O_CREAT|O_TRUNC|O_NOCTTY, 0666);
1127 perrorf (g, "open: %s", filename);
1131 /* Receive the file in chunked encoding. */
1132 while ((r = receive_file_data (g, &buf)) > 0) {
1133 if (xwrite (fd, buf, r) == -1) {
1134 perrorf (g, "%s: write", filename);
1145 error (g, _("%s: error in chunked encoding"), filename);
1149 if (close (fd) == -1) {
1150 perrorf (g, "close: %s", filename);
1157 /* Send cancellation message to daemon, then wait until it
1158 * cancels (just throwing away data).
1162 uint32_t flag = GUESTFS_CANCEL_FLAG;
1164 debug (g, "%s: waiting for daemon to acknowledge cancellation",
1167 xdrmem_create (&xdr, fbuf, sizeof fbuf, XDR_ENCODE);
1168 xdr_uint32_t (&xdr, &flag);
1171 if (xwrite (g->sock, fbuf, sizeof fbuf) == -1) {
1172 perrorf (g, _("write to daemon socket"));
1176 while (receive_file_data (g, NULL) > 0)
1177 ; /* just discard it */
1182 /* Receive a chunk of file data. */
1183 /* Returns -1 = error, 0 = EOF, > 0 = more data */
1185 receive_file_data (guestfs_h *g, void **buf_r)
1191 guestfs_chunk chunk;
1193 r = guestfs___recv_from_daemon (g, &len, &buf);
1195 error (g, _("receive_file_data: parse error in reply callback"));
1199 if (len == GUESTFS_LAUNCH_FLAG || len == GUESTFS_CANCEL_FLAG) {
1200 error (g, _("receive_file_data: unexpected flag received when reading file chunks"));
1204 memset (&chunk, 0, sizeof chunk);
1206 xdrmem_create (&xdr, buf, len, XDR_DECODE);
1207 if (!xdr_guestfs_chunk (&xdr, &chunk)) {
1208 error (g, _("failed to parse file chunk"));
1213 /* After decoding, the original buffer is no longer used. */
1217 if (g->user_cancel) {
1218 error (g, _("operation cancelled by user"));
1219 g->last_errnum = EINTR;
1222 error (g, _("file receive cancelled by daemon"));
1223 free (chunk.data.data_val);
1227 if (chunk.data.data_len == 0) { /* end of transfer */
1228 free (chunk.data.data_val);
1232 if (buf_r) *buf_r = chunk.data.data_val;
1233 else free (chunk.data.data_val); /* else caller frees */
1235 return chunk.data.data_len;