backends/rng-egd.c
------
buf即Rng的物理buffer指针,size即为Rng的buffer的大小。
static void rng_egd_chr_read(void *opaque, const uint8_t *buf, int size){
RngEgd *s = RNG_EGD(opaque);
size_t buf_offset = 0;
while (size > 0 && s->requests) {
RngRequest *req = s->requests->data;
int len = MIN(size, req->size - req->offset);
//如果请求的size(即req->size)大于size,则本次只可以读取Rng缓冲区大小的数据(即size大小的数据)
buf_offset += len;
req->offset += len;//以备下次读取的时候,不再读取上次已经读取过的数据。因为本次请求的数据大于Rng的缓冲区大小,所以只能等到Rng刷新缓冲区以后,再次读取本次请求还需读取的数据。
---
第二种情况,如果本次请求的size小于size的大小,则会不断循环的处理请求链表上的请求。直到Rng的buf为空。
---
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);
}
}
}