ostream-file.c revision 8a3d0935fb63a7e8e4b07f43471a24f8d063204f
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2002-2003 Timo Sirainen */
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen/* @UNSAFE: whole file */
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen/* try to keep the buffer size within 4k..128k. ReiserFS may actually return
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen 128k as optimal size. */
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen ((fstream)->head == (fstream)->tail && !(fstream)->full)
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen ((size) < SSIZE_T_MAX ? (size_t)(size) : SSIZE_T_MAX)
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen size_t buffer_size, max_buffer_size, optimal_block_size;
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen size_t head, tail; /* first unsent/unused byte */
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen void (*timeout_cb)(void *);
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen unsigned int full:1; /* if head == tail, is buffer empty or full? */
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainenstatic void stream_closed(struct file_ostream *fstream)
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen if (fstream->autoclose_fd && fstream->fd != -1) {
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen struct file_ostream *fstream = (struct file_ostream *) stream;
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen /* flush output before really closing it */
906520ee2cece20c875835697db08cd5e29b919bTimo Sirainen struct file_ostream *fstream = (struct file_ostream *) stream;
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen p_free(fstream->ostream.iostream.pool, fstream->buffer);
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainenstatic void _set_max_buffer_size(struct _iostream *stream, size_t max_size)
3efdcb59492bd1e0602340a4204003a32b34654aTimo Sirainen struct file_ostream *fstream = (struct file_ostream *) stream;
if (timeout_msecs != 0)
while (size > 0) {
size = 0;
/* XXXT...HXXX */
static ssize_t
iov++;
iov_size--;
if (ret < 0) {
return ret;
if (size > 0) {
iov_len++;
if (first)
int iov_len;
int ret;
return ret;
/* XXXT...HXXX */
if (ret < 0) {
int iov_len;
sent = 0;
fstream);
return sent;
if (ret > 0)
return ret;
return ret;
int first;
if (first)
if (ret <= 0) {
if (ret == 0) {
ret = 0;
int iov_len;
const unsigned char *data;
int pos;
skip_size = 0;
while (in_size > 0) {
if (size == 0) {
if (ret < 0) {
if (skip_size > 0) {
ret = 0;
skip_size = 0;
iov_len--;
iov_len--;
const unsigned char *data;
if (ret < 0) {
overlapping = 0;
if (ret == 0) {
return ret;
if (overlapping <= 0)
struct ostream *
int autoclose_fd)
if (offset >= 0) {
#ifndef HAVE_LINUX_SENDFILE
return ostream;