ostream-file.c revision 5238111c460098d9cc8cc22527026138a278b9a4
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody/* Copyright (c) 2002-2003 Timo Sirainen */
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody/* @UNSAFE: whole file */
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody/* try to keep the buffer size within 4k..128k. ReiserFS may actually return
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody 128k as optimal size. */
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody ((fstream)->head == (fstream)->tail && !(fstream)->full)
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody ((size) < SSIZE_T_MAX ? (size_t)(size) : SSIZE_T_MAX)
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody size_t buffer_size, max_buffer_size, optimal_block_size;
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody size_t head, tail; /* first unsent/unused byte */
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody unsigned int full:1; /* if head == tail, is buffer empty or full? */
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmodystatic void stream_closed(struct file_ostream *fstream)
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody if (fstream->autoclose_fd && fstream->fd != -1) {
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody struct file_ostream *fstream = (struct file_ostream *)stream;
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody /* flush output before really closing it */
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody struct file_ostream *fstream = (struct file_ostream *)stream;
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody p_free(fstream->ostream.iostream.pool, fstream->buffer);
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmodystatic void _set_max_buffer_size(struct _iostream *stream, size_t max_size)
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody struct file_ostream *fstream = (struct file_ostream *)stream;
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmodystatic void update_buffer(struct file_ostream *fstream, size_t size)
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody /* ...HXXXT... */
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmodystatic ssize_t o_stream_writev(struct file_ostream *fstream,
42826d96c8d0bba9eddc85b01bf70d7db571ae7fPhil Carmody ret = write(fstream->fd, iov->iov_base, iov->iov_len);
for (i = 0; i < UIO_MAXIOV; i++)
iov_size);
if (ret > 0)
if (ret < 0) {
return ret;
int iov_len;
if (iov_len > 0) {
if (ret < 0)
} else if (!set) {
/* XXXT...HXXX */
if (ret < 0) {
int ret;
sent = 0;
fstream);
return sent;
if (ret < 0)
iov++;
iov_count--;
if (iov_count > 0) {
return ret;
iov++;
iov_count--;
for (i = 0; i < iov_count; i++) {
return ret;
return ret;
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 = 0;
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) {
if (max_buffer_size == 0)
return ostream;