static void rng_egd_chr_read(void *opaque, const uint8_t *buf, int size) { RngEgd *s = RNG_EGD(opaque); while (size > 0 && s->requests) { RngRequest *req = s->requests->data; int len = MIN(size, req->size - req->offset); memcpy(req->data + req->offset, buf, len); req->offset += len; size -= len; if (req->offset == req->size) { s->requests = g_slist_remove_link(s->requests, s->requests); req->receive_entropy(req->opaque, req->data, req->size); rng_egd_free_request(req); } } }
static void entropy_available(void *opaque) { RndRandom *s = RNG_RANDOM(opaque); while (!QSIMPLEQ_EMPTY(&s->parent.requests)) { RngRequest *req = QSIMPLEQ_FIRST(&s->parent.requests); ssize_t len; len = read(s->fd, req->data, req->size); if (len < 0 && errno == EAGAIN) { return; } g_assert(len != -1); req->receive_entropy(req->opaque, req->data, len); rng_backend_finalize_request(&s->parent, req); } /* We've drained all requests, the fd handler can be reset. */ qemu_set_fd_handler(s->fd, NULL, NULL, NULL); }