rng_egd_chr_read分析

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大小的数据)


        memcpy(req->data + req->offset, buf + buf_offset, len); //buf+buf_offset的patch很好!!!当req->size > size时,下次重新再读该缓存的时候,重新调用rng_egd_chr_read函数,buf_offset重新被赋值为0.很好!!!
        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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值