- error (g, _("sock_write_event: state %d != BUSY"), g->state);
- return;
- }
-
- if (g->verbose)
- fprintf (stderr, "sock_write_event: writing %d bytes ...\n",
- g->msg_out_size - g->msg_out_pos);
-
- n = write (g->sock, g->msg_out + g->msg_out_pos,
- g->msg_out_size - g->msg_out_pos);
- if (n == -1) {
- err = errno;
- if (err != EAGAIN)
- perrorf (g, "write");
- if (err == EPIPE) /* Disconnected from guest (RHBZ#508713). */
- child_cleanup (g);
- return;
- }
-
- if (g->verbose)
- fprintf (stderr, "sock_write_event: wrote %d bytes\n", n);
-
- g->msg_out_pos += n;
-
- /* More to write? */
- if (g->msg_out_pos < g->msg_out_size)
- return;
-
- if (g->verbose)
- fprintf (stderr, "sock_write_event: done writing, calling send_cb\n");
-
- free (g->msg_out);
- g->msg_out = NULL;
- g->msg_out_pos = g->msg_out_size = 0;
-
- /* Done writing, call the higher layer. */
- if (g->send_cb)
- g->send_cb (g, g->send_cb_data);
-}
-
-void
-guestfs_set_send_callback (guestfs_h *g,
- guestfs_send_cb cb, void *opaque)
-{
- g->send_cb = cb;
- g->send_cb_data = opaque;
-}
-
-void
-guestfs_set_reply_callback (guestfs_h *g,
- guestfs_reply_cb cb, void *opaque)
-{
- g->reply_cb = cb;
- g->reply_cb_data = opaque;
-}
-
-void
-guestfs_set_log_message_callback (guestfs_h *g,
- guestfs_log_message_cb cb, void *opaque)
-{
- g->log_message_cb = cb;
- g->log_message_cb_data = opaque;
-}
-
-void
-guestfs_set_subprocess_quit_callback (guestfs_h *g,
- guestfs_subprocess_quit_cb cb, void *opaque)
-{
- g->subprocess_quit_cb = cb;
- g->subprocess_quit_cb_data = opaque;
-}
-
-void
-guestfs_set_launch_done_callback (guestfs_h *g,
- guestfs_launch_done_cb cb, void *opaque)
-{
- g->launch_done_cb = cb;
- g->launch_done_cb_data = opaque;
-}
-
-/* Access to the handle's main loop and the default main loop. */
-void
-guestfs_set_main_loop (guestfs_h *g, guestfs_main_loop *main_loop)
-{
- g->main_loop = main_loop;
-}
-
-guestfs_main_loop *
-guestfs_get_main_loop (guestfs_h *g)
-{
- return g->main_loop;
-}
-
-guestfs_main_loop *
-guestfs_get_default_main_loop (void)
-{
- return (guestfs_main_loop *) &default_main_loop;
-}
-
-/* Change the daemon socket handler so that we are now writing.
- * This sets the handle to sock_write_event.
- */
-int
-guestfs__switch_to_sending (guestfs_h *g)
-{
- if (g->sock_watch >= 0) {
- if (g->main_loop->remove_handle (g->main_loop, g, g->sock_watch) == -1) {
- error (g, _("remove_handle failed"));
- g->sock_watch = -1;
- return -1;
- }
- }
-
- g->sock_watch =
- g->main_loop->add_handle (g->main_loop, g, g->sock,
- GUESTFS_HANDLE_WRITABLE,
- sock_write_event, NULL);
- if (g->sock_watch == -1) {
- error (g, _("add_handle failed"));
- return -1;
- }
-
- return 0;
-}
-
-int
-guestfs__switch_to_receiving (guestfs_h *g)
-{
- if (g->sock_watch >= 0) {
- if (g->main_loop->remove_handle (g->main_loop, g, g->sock_watch) == -1) {
- error (g, _("remove_handle failed"));
- g->sock_watch = -1;
- return -1;
- }
- }
-
- g->sock_watch =
- g->main_loop->add_handle (g->main_loop, g, g->sock,
- GUESTFS_HANDLE_READABLE,
- sock_read_event, NULL);
- if (g->sock_watch == -1) {
- error (g, _("add_handle failed"));
- return -1;
- }
-
- return 0;
-}
-
-/* Dispatch a call (len + header + args) to the remote daemon,
- * synchronously (ie. using the guest's main loop to wait until
- * it has been sent). Returns -1 for error, or the serial
- * number of the message.
- */
-static void
-send_cb (guestfs_h *g, void *data)
-{
- guestfs_main_loop *ml = guestfs_get_main_loop (g);
-
- *((int *)data) = 1;
- ml->main_loop_quit (ml, g);
-}
-
-int
-guestfs__send_sync (guestfs_h *g, int proc_nr,
- xdrproc_t xdrp, char *args)
-{
- struct guestfs_message_header hdr;
- XDR xdr;
- u_int32_t len;
- int serial = g->msg_next_serial++;
- int sent;
- guestfs_main_loop *ml = guestfs_get_main_loop (g);
-
- if (g->state != BUSY) {
- error (g, _("guestfs__send_sync: state %d != BUSY"), g->state);
- return -1;
- }
-
- /* This is probably an internal error. Or perhaps we should just
- * free the buffer anyway?
- */
- if (g->msg_out != NULL) {
- error (g, _("guestfs__send_sync: msg_out should be NULL"));
- return -1;