return;
}
}
- } else if (!libxl__ev_fd_isregistered(&dc->toread)) {
+ } else if (!libxl__ev_fd_isregistered(&dc->toread) ||
+ dc->bytes_to_read == 0) {
/* we have had eof */
datacopier_callback(egc, dc, 0, 0);
return;
buf->used = 0;
LIBXL_TAILQ_INSERT_TAIL(&dc->bufs, buf, entry);
}
- int r = read(ev->fd,
- buf->buf + buf->used,
- sizeof(buf->buf) - buf->used);
+ int r = read(ev->fd, buf->buf + buf->used,
+ min_t(size_t, sizeof(buf->buf) - buf->used,
+ (dc->bytes_to_read == -1) ? SIZE_MAX : dc->bytes_to_read));
if (r < 0) {
if (errno == EINTR) continue;
if (errno == EWOULDBLOCK) break;
buf->used += r;
dc->used += r;
assert(buf->used <= sizeof(buf->buf));
+ if (dc->bytes_to_read > 0)
+ dc->bytes_to_read -= r;
+ if (dc->bytes_to_read == 0)
+ break;
}
datacopier_check_state(egc, dc);
}
bl->keystrokes.ao = ao;
bl->keystrokes.maxsz = BOOTLOADER_BUF_OUT;
+ bl->keystrokes.bytes_to_read = -1;
bl->keystrokes.copywhat =
GCSPRINTF("bootloader input for domain %"PRIu32, bl->domid);
bl->keystrokes.callback = bootloader_keystrokes_copyfail;
bl->display.ao = ao;
bl->display.maxsz = BOOTLOADER_BUF_IN;
+ bl->display.bytes_to_read = -1;
bl->display.copywhat =
GCSPRINTF("bootloader output for domain %"PRIu32, bl->domid);
bl->display.callback = bootloader_display_copyfail;
dc->readfd = -1;
dc->writefd = fd;
dc->maxsz = INT_MAX;
+ dc->bytes_to_read = -1;
dc->copywhat = GCSPRINTF("qemu save file for domain %"PRIu32, dss->domid);
dc->writewhat = "save/migration stream";
dc->callback = save_device_model_datacopier_done;
libxl__ao *ao;
int readfd, writefd;
ssize_t maxsz;
+ ssize_t bytes_to_read; /* set to -1 to read until EOF */
const char *copywhat, *readwhat, *writewhat; /* for error msgs */
FILE *log; /* gets a copy of everything */
libxl__datacopier_callback *callback;