/* Warning: if you change this function, be sure to * change apr_bucket_pool_make() too! */ APU_DECLARE(apr_bucket *) apr_bucket_heap_make(apr_bucket *b, const char *buf, apr_size_t length, void (*free_func)(void *data)) { apr_bucket_heap *h; h = apr_bucket_alloc(sizeof(*h), b->list); if (!free_func) { h->alloc_len = length; h->base = apr_bucket_alloc(h->alloc_len, b->list); if (h->base == NULL) { apr_bucket_free(h); return NULL; } h->free_func = apr_bucket_free; memcpy(h->base, buf, length); } else { /* XXX: we lose the const qualifier here which indicates * there's something screwy with the API... */ h->base = (char *) buf; h->alloc_len = length; h->free_func = free_func; } b = apr_bucket_shared_make(b, h, 0, length); b->type = &apr_bucket_type_heap; return b; }
APU_DECLARE(apr_bucket *) apr_bucket_pool_make(apr_bucket *b, const char *buf, apr_size_t length, apr_pool_t *pool) { apr_bucket_pool *p; p = apr_bucket_alloc(sizeof(*p), b->list); /* XXX: we lose the const qualifier here which indicates * there's something screwy with the API... */ /* XXX: why is this? buf is const, p->base is const... what's * the problem? --jcw */ p->base = (char *) buf; p->pool = pool; p->list = b->list; b = apr_bucket_shared_make(b, p, 0, length); b->type = &apr_bucket_type_pool; /* pre-initialize heap bucket member */ p->heap.alloc_len = length; p->heap.base = NULL; p->heap.free_func = apr_bucket_free; apr_pool_cleanup_register(p->pool, p, pool_bucket_cleanup, apr_pool_cleanup_null); return b; }
apr_bucket *h2_bucket_eos_make(apr_bucket *b, h2_stream *stream) { h2_bucket_eos *h; h = apr_bucket_alloc(sizeof(*h), b->list); h->stream = stream; b = apr_bucket_shared_make(b, h, 0, 0); b->type = &h2_bucket_type_eos; return b; }
AP_DECLARE(apr_bucket *) ap_bucket_error_make(apr_bucket *b, int error, const char *buf, apr_pool_t *p) { ap_bucket_error *h; h = apr_bucket_alloc(sizeof(*h), b->list); h->status = error; h->data = (buf) ? apr_pstrdup(p, buf) : NULL; b = apr_bucket_shared_make(b, h, 0, 0); b->type = &ap_bucket_type_error; return b; }
apr_bucket * apr_bucket_nginx_make(apr_bucket *b, ngx_buf_t *buf, apr_pool_t *pool) { apr_bucket_nginx *n; n = apr_bucket_alloc(sizeof(*n), b->list); n->buf = buf; b = apr_bucket_shared_make(b, n, 0, ngx_buf_size(buf)); b->type = &apr_bucket_type_nginx; return b; }
static apr_bucket *apr_bucket_lob_make(apr_bucket *b, const apr_dbd_row_t *row, int col, apr_off_t offset, apr_size_t len, apr_pool_t *p) { apr_bucket_lob *f; f = apr_bucket_alloc(sizeof(*f), b->list); f->row = row; f->col = col; f->readpool = p; b = apr_bucket_shared_make(b, f, offset, len); b->type = &apr_bucket_type_lob; return b; }
static apr_bucket * h2_beam_bucket_make(apr_bucket *b, h2_bucket_beam *beam, apr_bucket *bred, apr_size_t n) { h2_beam_proxy *d; d = apr_bucket_alloc(sizeof(*d), b->list); H2_BPROXY_LIST_INSERT_TAIL(&beam->proxies, d); d->beam = beam; d->bred = bred; d->n = n; b = apr_bucket_shared_make(b, d, 0, bred? bred->length : 0); b->type = &h2_bucket_type_beam; return b; }
APU_DECLARE(apr_bucket *) apr_bucket_file_make(apr_bucket *b, apr_file_t *fd, apr_off_t offset, apr_size_t len, apr_pool_t *p) { apr_bucket_file *f; f = apr_bucket_alloc(sizeof(*f), b->list); f->fd = fd; f->readpool = p; #if APR_HAS_MMAP f->can_mmap = 1; #endif b = apr_bucket_shared_make(b, f, offset, len); b->type = &apr_bucket_type_file; return b; }