9 enum { MEM_CHUNK
, FILE_CHUNK
} type
;
11 buffer
*mem
; /* either the storage of the mem-chunk or the read-ahead buffer */
15 buffer
*name
; /* name of the file */
16 off_t start
; /* starting offset in the file */
17 off_t length
; /* octets to send from the starting offset */
21 char *start
; /* the start pointer of the mmap'ed area */
22 size_t length
; /* size of the mmap'ed area */
23 off_t offset
; /* start is <n> octet away from the start of the file */
26 int is_temp
; /* file is temporary and will be deleted if on cleanup */
29 /* the size of the chunk is either:
30 * - mem-chunk: buffer_string_length(chunk::mem)
31 * - file-chunk: chunk::file.length
33 off_t offset
; /* octets sent from this chunk */
45 off_t bytes_in
, bytes_out
;
48 unsigned int upload_temp_file_size
;
49 unsigned int tempdir_idx
;
52 chunkqueue
*chunkqueue_init(void);
53 void chunkqueue_set_tempdirs_default (array
*tempdirs
, unsigned int upload_temp_file_size
);
54 void chunkqueue_append_file(chunkqueue
*cq
, buffer
*fn
, off_t offset
, off_t len
); /* copies "fn" */
55 void chunkqueue_append_file_fd(chunkqueue
*cq
, buffer
*fn
, int fd
, off_t offset
, off_t len
); /* copies "fn" */
56 void chunkqueue_append_mem(chunkqueue
*cq
, const char *mem
, size_t len
); /* copies memory */
57 void chunkqueue_append_buffer(chunkqueue
*cq
, buffer
*mem
); /* may reset "mem" */
58 void chunkqueue_prepend_buffer(chunkqueue
*cq
, buffer
*mem
); /* may reset "mem" */
59 void chunkqueue_append_chunkqueue(chunkqueue
*cq
, chunkqueue
*src
);
61 struct server
; /*(declaration)*/
62 int chunkqueue_append_mem_to_tempfile(struct server
*srv
, chunkqueue
*cq
, const char *mem
, size_t len
);
64 /* functions to handle buffers to read into: */
65 /* return a pointer to a buffer in *mem with size *len;
66 * it should be at least min_size big, and use alloc_size if
67 * new memory is allocated.
68 * modifying the chunkqueue invalidates the memory area.
69 * should always be followed by chunkqueue_get_memory(),
70 * even if nothing was read.
71 * pass 0 for min_size/alloc_size for default values
73 void chunkqueue_get_memory(chunkqueue
*cq
, char **mem
, size_t *len
, size_t min_size
, size_t alloc_size
);
74 /* append first len bytes of the memory queried with
75 * chunkqueue_get_memory to the chunkqueue
77 void chunkqueue_use_memory(chunkqueue
*cq
, size_t len
);
79 /* mark first "len" bytes as written (incrementing chunk offsets)
80 * and remove finished chunks
82 void chunkqueue_mark_written(chunkqueue
*cq
, off_t len
);
84 void chunkqueue_remove_finished_chunks(chunkqueue
*cq
);
86 void chunkqueue_steal(chunkqueue
*dest
, chunkqueue
*src
, off_t len
);
88 int chunkqueue_steal_with_tempfiles(struct server
*srv
, chunkqueue
*dest
, chunkqueue
*src
, off_t len
);
90 off_t
chunkqueue_length(chunkqueue
*cq
);
91 void chunkqueue_free(chunkqueue
*cq
);
92 void chunkqueue_reset(chunkqueue
*cq
);
94 int chunkqueue_is_empty(chunkqueue
*cq
);