static void peerDigestSwapInCBlock(void *data, mem_node_ref nr, ssize_t size) { const char *buf = nr.node->data + nr.offset; DigestFetchState *fetch = data; if (peerDigestFetchedEnough(fetch, size, "peerDigestSwapInCBlock")) goto finish; fetch->offset += size; memcpy(fetch->buf + fetch->buf_used, buf, size); fetch->buf_used += size; if (fetch->buf_used >= StoreDigestCBlockSize) { PeerDigest *pd = fetch->pd; HttpReply *rep = fetch->entry->mem_obj->reply; assert(pd && rep); if (peerDigestSetCBlock(pd, fetch->buf)) { /* XXX: soon we will have variable header size */ fetch->offset -= fetch->buf_used - StoreDigestCBlockSize; /* switch to CD buffer and fetch digest guts */ memFree(fetch->buf, MEM_4K_BUF); fetch->buf = NULL; fetch->buf_used = 0; assert(pd->cd->mask); storeClientRef(fetch->sc, fetch->entry, fetch->offset, fetch->offset, pd->cd->mask_size, peerDigestSwapInMask, fetch); } else { peerDigestFetchAbort(fetch, "invalid digest cblock"); } } else { /* need more data, do we have space? */ if (fetch->buf_used >= SM_PAGE_SIZE) peerDigestFetchAbort(fetch, "digest cblock too big"); else storeClientRef(fetch->sc, fetch->entry, fetch->offset, fetch->offset, SM_PAGE_SIZE - fetch->buf_used, peerDigestSwapInCBlock, fetch); } finish: stmemNodeUnref(&nr); }
static void peerDigestSwapInCBlock(void *data, char *buf, ssize_t size) { DigestFetchState *fetch = data; if (peerDigestFetchedEnough(fetch, buf, size, "peerDigestSwapInCBlock")) return; if (size >= StoreDigestCBlockSize) { PeerDigest *pd = fetch->pd; HttpReply *rep = fetch->entry->mem_obj->reply; const int seen = fetch->offset + size; assert(pd && rep); if (peerDigestSetCBlock(pd, buf)) { /* XXX: soon we will have variable header size */ fetch->offset += StoreDigestCBlockSize; /* switch to CD buffer and fetch digest guts */ memFree(buf, MEM_4K_BUF); buf = NULL; assert(pd->cd->mask); storeClientCopy(fetch->entry, seen, fetch->offset, pd->cd->mask_size, pd->cd->mask, peerDigestSwapInMask, fetch); } else { peerDigestFetchAbort(fetch, buf, "invalid digest cblock"); } } else { /* need more data, do we have space? */ if (size >= SM_PAGE_SIZE) peerDigestFetchAbort(fetch, buf, "digest cblock too big"); else storeClientCopy(fetch->entry, size, 0, SM_PAGE_SIZE, buf, peerDigestSwapInCBlock, fetch); } }