ostream.h revision 981139bb2e446bb2050c1158614725f8413fd709
#ifndef OSTREAM_H
#define OSTREAM_H
#include "ioloop.h"
struct ostream {
each call. */
int stream_errno;
int last_failed_errno;
/* overflow is set when some of the data given to send()
functions was neither sent nor buffered. It's never unset inside
ostream code. */
unsigned int overflow:1;
unsigned int closed:1;
struct ostream_private *real_stream;
};
/* Returns 1 if all data is sent (not necessarily flushed), 0 if not.
Pretty much the only real reason to return 0 is if you wish to send more
data to client which isn't buffered, eg. o_stream_send_istream(). */
typedef int stream_flush_callback_t(void *context);
typedef void ostream_callback_t(void *context);
/* Create new output stream from given file descriptor.
If max_buffer_size is 0, an "optimal" buffer size is used (max 128kB). */
struct ostream *
/* The fd is set to -1 immediately to avoid accidentally closing it twice. */
/* Create an output stream from a regular file which begins at given offset.
If offset==(uoff_t)-1, the current offset isn't known. */
struct ostream *
/* Create an output stream to a buffer. */
/* Create an output streams that always fails the writes. */
struct ostream *
/* Create an output stream that simply passes through data. This is mainly
useful as a wrapper when combined with destroy callbacks. */
/* Set name (e.g. path) for output stream. */
/* Get output stream's name. Returns "" if stream has no name. */
/* Return file descriptor for stream, or -1 if none is available. */
/* Returns error string for the previous error (stream_errno,
not last_failed_errno). */
/* Close this stream (but not its parents) and unreference it. */
/* Reference counting. References start from 1, so calling o_stream_unref()
destroys the stream if o_stream_ref() is never used. */
/* Unreferences the stream and sets stream pointer to NULL. */
/* Call the given callback function when stream is destroyed. */
ATTR_NULL(3);
/* Remove the destroy callback. */
void (*callback)());
/* Mark the stream and all of its parent streams closed. Nothing will be
sent after this call. */
/* Set IO_WRITE callback. Default will just try to flush the output and
finishes when the buffer is empty. */
/* Change the maximum size for stream's output buffer to grow. */
/* Returns the current max. buffer size. */
/* Delays sending as far as possible, writing only full buffers. Also sets
TCP_CORK on if supported. */
/* Try to flush the output stream. Returns 1 if all sent, 0 if not,
-1 if error. */
/* Set "flush pending" state of stream. If set, the flush callback is called
when more data is allowed to be sent, even if the buffer itself is empty. */
/* Returns number of bytes currently in buffer. */
/* Returns number of bytes we can still write without failing. */
/* Seek to specified position from beginning of file. This works only for
files. Returns 1 if successful, -1 if error. */
/* Returns number of bytes sent, -1 = error */
unsigned int iov_count);
/* Send with delayed error handling. o_stream_has_errors() or
o_stream_ignore_last_errors() must be called after these functions before
the stream is destroyed. */
unsigned int iov_count);
/* Flushes the stream and returns -1 if stream->last_failed_errno is
non-zero. Marks the stream's error handling as completed. errno is also set
to last_failed_errno. */
/* Marks the stream's error handling as completed to avoid i_panic() on
destroy. */
/* If error handling is disabled, the i_panic() on destroy is never called.
This function can be called immediately after the stream is created.
When creating wrapper streams, they copy this behavior from the parent
stream. */
/* Send data from input stream. Returns number of bytes sent, or -1 if error
in either outstream or instream. Note that this function may block if either
instream or outstream is blocking.
Also note that this function may not add anything to the output buffer, so
if you want the flush callback to be called when more data can be written,
you'll need to call o_stream_set_flush_pending() manually.
It's also possible to use this function to copy data within same file
descriptor. If the file must be grown, you have to do it manually before
calling this function. */
/* Write data to specified offset. Returns 0 if successful, -1 if error. */
/* If there are any I/O loop items associated with the stream, move all of
them to current_ioloop. */
#endif