- struct receive_file_ctx ctx;
- guestfs_main_loop *ml = guestfs_get_main_loop (g);
- int i;
- size_t len;
-
- ctx.count = 0;
- ctx.chunks = NULL;
-
- guestfs_set_reply_callback (g, receive_file_cb, &ctx);
- (void) ml->main_loop_run (ml, g);
- guestfs_set_reply_callback (g, NULL, NULL);
-
- if (ctx.count == 0) {
- error (g, _("receive_file_data_sync: reply callback not called\n"));
- return -1;
- }
-
- if (ctx.count == -1) {
- error (g, _("receive_file_data_sync: parse error in reply callback\n"));
- /* callback already freed the chunks */
- return -1;
- }
-
- if (g->verbose)
- fprintf (stderr, "receive_file_data_sync: got %d chunks\n", ctx.count);
-
- /* Process each chunk in the list. */
- if (buf) *buf = NULL; /* Accumulate data in this buffer. */
- len = 0;
-
- for (i = 0; i < ctx.count; ++i) {
- if (ctx.chunks[i].cancel) {
- error (g, _("file receive cancelled by daemon"));
- free_chunks (&ctx);
- if (buf) free (*buf);
- if (len_r) *len_r = 0;
- return -1;
- }
-
- if (ctx.chunks[i].data.data_len == 0) { /* end of transfer */
- free_chunks (&ctx);
- if (len_r) *len_r = len;
- return 0;
- }
-
- if (buf) {
- *buf = safe_realloc (g, *buf, len + ctx.chunks[i].data.data_len);
- memcpy (*buf+len, ctx.chunks[i].data.data_val,
- ctx.chunks[i].data.data_len);
- }
- len += ctx.chunks[i].data.data_len;
- }
-
- if (len_r) *len_r = len;
- free_chunks (&ctx);
- return 1;
-}
-
-/* This is the default main loop implementation, using select(2). */
-
-static int
-select_add_handle (guestfs_main_loop *mlv, guestfs_h *g, int fd, int events,
- guestfs_handle_event_cb cb, void *data)
-{
- struct select_main_loop *ml = (struct select_main_loop *) mlv;
-
- if (fd < 0 || fd >= FD_SETSIZE) {
- error (g, _("fd %d is out of range"), fd);
- return -1;
- }
-
- if ((events & ~(GUESTFS_HANDLE_READABLE |
- GUESTFS_HANDLE_WRITABLE |
- GUESTFS_HANDLE_HANGUP |
- GUESTFS_HANDLE_ERROR)) != 0) {
- error (g, _("set of events (0x%x) contains unknown events"), events);
- return -1;
- }
-
- if (events == 0) {
- error (g, _("set of events is empty"));
- return -1;
- }