#ifndef __CHAINBUFFER_H__ #define __CHAINBUFFER_H__ #include #include #include #include typedef struct chain_buffer_node chain_buffer_node_t; typedef struct chain_buffer_s { chain_buffer_node_t *head; chain_buffer_node_t *tail; size_t total_len; size_t chunk_size; chain_buffer_node_t *free_list; size_t free_count; size_t free_limit; uint8_t *linear_cache; size_t linear_cap; } chain_buffer_t; typedef struct chain_buffer_list_s { chain_buffer_node_t *head; chain_buffer_node_t *tail; size_t total_len; } chain_buffer_list_t; void chain_buffer_init(chain_buffer_t *buf, size_t chunk_size); void chain_buffer_reset(chain_buffer_t *buf); size_t chain_buffer_len(const chain_buffer_t *buf); int chain_buffer_append(chain_buffer_t *buf, const void *data, size_t len); size_t chain_buffer_drain(chain_buffer_t *buf, size_t len); const uint8_t *chain_buffer_linearize(chain_buffer_t *buf, size_t *out_len); ssize_t chain_buffer_send_fd(chain_buffer_t *buf, int fd, int flags); /* readv zero-copy recv helpers */ int chain_buffer_prepare_recv_iov(chain_buffer_t *buf, struct iovec *iov, int max_iov); size_t chain_buffer_commit_recv(chain_buffer_t *buf, size_t len); /* ownership transfer helpers */ void chain_buffer_list_init(chain_buffer_list_t *list); size_t chain_buffer_list_len(const chain_buffer_list_t *list); int chain_buffer_list_iov(const chain_buffer_list_t *list, struct iovec *iov, int max_iov); int chain_buffer_detach_prefix(chain_buffer_t *buf, size_t len, chain_buffer_list_t *out); void chain_buffer_list_release(chain_buffer_t *owner, chain_buffer_list_t *list); #endif