void chunkqueue_get_memory(chunkqueue *cq, char **mem, size_t *len, size_t min_size, size_t alloc_size) { static const size_t REALLOC_MAX_SIZE = 256; chunk *c; buffer *b; char *dummy_mem; size_t dummy_len; force_assert(NULL != cq); if (NULL == mem) mem = &dummy_mem; if (NULL == len) len = &dummy_len; /* default values: */ if (0 == min_size) min_size = 1024; if (0 == alloc_size) alloc_size = 4096; if (alloc_size < min_size) alloc_size = min_size; if (NULL != cq->last && MEM_CHUNK == cq->last->type) { size_t have; b = cq->last->mem; have = buffer_string_space(b); /* unused buffer: allocate space */ if (buffer_string_is_empty(b)) { buffer_string_prepare_copy(b, alloc_size); have = buffer_string_space(b); } /* if buffer is really small just make it bigger */ else if (have < min_size && b->size <= REALLOC_MAX_SIZE) { size_t cur_len = buffer_string_length(b); size_t new_size = cur_len + min_size, append; if (new_size < alloc_size) new_size = alloc_size; append = new_size - cur_len; if (append >= min_size) { buffer_string_prepare_append(b, append); have = buffer_string_space(b); } } /* return pointer into existing buffer if large enough */ if (have >= min_size) { *mem = b->ptr + buffer_string_length(b); *len = have; return; } } /* allocate new chunk */ c = chunkqueue_get_unused_chunk(cq); c->type = MEM_CHUNK; chunkqueue_append_chunk(cq, c); b = c->mem; buffer_string_prepare_append(b, alloc_size); *mem = b->ptr + buffer_string_length(b); *len = buffer_string_space(b); }
void chunkqueue_append_mem(chunkqueue *cq, const char * mem, size_t len) { chunk *c; if (0 == len) return; c = chunkqueue_get_unused_chunk(cq); c->type = MEM_CHUNK; buffer_copy_string_len(c->mem, mem, len); chunkqueue_append_chunk(cq, c); }
void chunkqueue_prepend_buffer(chunkqueue *cq, buffer *mem) { chunk *c; if (buffer_string_is_empty(mem)) return; c = chunkqueue_get_unused_chunk(cq); c->type = MEM_CHUNK; force_assert(NULL != c->mem); buffer_move(c->mem, mem); chunkqueue_prepend_chunk(cq, c); }
buffer *chunkqueue_get_append_buffer(chunkqueue *cq) { chunk *c; c = chunkqueue_get_unused_chunk(cq); c->type = MEM_CHUNK; c->offset = 0; buffer_reset(c->mem); chunkqueue_append_chunk(cq, c); return c->mem; }
int chunkqueue_append_buffer_weak(chunkqueue *cq, buffer *mem) { chunk *c; c = chunkqueue_get_unused_chunk(cq); c->type = MEM_CHUNK; c->offset = 0; if (c->mem) buffer_free(c->mem); c->mem = mem; chunkqueue_append_chunk(cq, c); return 0; }
int chunkqueue_append_mem(chunkqueue *cq, const char * mem, size_t len) { chunk *c; if (len == 0) return 0; c = chunkqueue_get_unused_chunk(cq); c->type = MEM_CHUNK; c->offset = 0; buffer_copy_string_len(c->mem, mem, len - 1); chunkqueue_append_chunk(cq, c); return 0; }
int chunkqueue_prepend_buffer(chunkqueue *cq, buffer *mem) { chunk *c; if (mem->used == 0) return 0; c = chunkqueue_get_unused_chunk(cq); c->type = MEM_CHUNK; c->offset = 0; buffer_copy_string_buffer(c->mem, mem); chunkqueue_prepend_chunk(cq, c); return 0; }
void chunkqueue_append_file(chunkqueue *cq, buffer *fn, off_t offset, off_t len) { chunk *c; if (0 == len) return; c = chunkqueue_get_unused_chunk(cq); c->type = FILE_CHUNK; buffer_copy_buffer(c->file.name, fn); c->file.start = offset; c->file.length = len; c->offset = 0; chunkqueue_append_chunk(cq, c); }
int chunkqueue_append_smb_file(chunkqueue *cq, buffer *fn, off_t offset, off_t len) { chunk *c; if (len == 0) return 0; c = chunkqueue_get_unused_chunk(cq); c->type = SMB_CHUNK; buffer_copy_string_buffer(c->file.name, fn); c->file.start = offset; c->file.length = len; c->offset = 0; //- JerryLin add c->roffset = 0; c->open_thread = -1; c->listcount = 0; Cdbg(1,"chunkqueue_append_smb_file.....fn=[%s]", fn->ptr); chunkqueue_append_chunk(cq, c); return 0; }
return c->mem; } int chunkqueue_set_tempdirs(chunkqueue *cq, array *tempdirs) { if (!cq) return -1; cq->tempdirs = tempdirs; return 0; } chunk *chunkqueue_get_append_tempfile(chunkqueue *cq) { chunk *c; buffer *template = buffer_init_string("/var/tmp/lighttpd-upload-XXXXXX"); c = chunkqueue_get_unused_chunk(cq); c->type = FILE_CHUNK; c->offset = 0; if (cq->tempdirs && cq->tempdirs->used) { size_t i; /* we have several tempdirs, only if all of them fail we jump out */ for (i = 0; i < cq->tempdirs->used; i++) { data_string *ds = (data_string *)cq->tempdirs->data[i]; buffer_copy_string_buffer(template, ds->value); BUFFER_APPEND_SLASH(template); buffer_append_string_len(template, CONST_STR_LEN("lighttpd-upload-XXXXXX"));