ostream.h revision bf87a5247ca33660ab8f20c12556ad16d7159395
1e21e6be70994b1aa9e52ca0e2f51afefca6d0dfTimo Sirainen /* Number of bytes sent via o_stream_send*() and similar functions.
1e21e6be70994b1aa9e52ca0e2f51afefca6d0dfTimo Sirainen This is counting the input data. For example with a compressed
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen ostream this is counting the uncompressed bytes. The compressed
e82af44fe25ca9b88210f313548dc08538e4a677Timo Sirainen bytes could be counted from the parent ostream's offset.
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen Seeking to a specified offset only makes sense if there is no
e82af44fe25ca9b88210f313548dc08538e4a677Timo Sirainen difference between input and output data sizes (e.g. there are no
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen wrapper ostreams changing the data). */
a4ac325c2802693c6b761e5a8fda961e5d7490eaTimo Sirainen /* errno for the last operation send/seek operation. cleared before
a4ac325c2802693c6b761e5a8fda961e5d7490eaTimo Sirainen each call. */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen /* overflow is set when some of the data given to send()
86bea1f8bffc2d98196f8655eecea9174c4f458aTimo Sirainen functions was neither sent nor buffered. It's never unset inside
86bea1f8bffc2d98196f8655eecea9174c4f458aTimo Sirainen ostream code. */
86bea1f8bffc2d98196f8655eecea9174c4f458aTimo Sirainen /* o_stream_send() writes all the data or returns failure */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen/* Returns 1 if all data is sent (not necessarily flushed), 0 if not.
7d6389e4053c2dac1fb37180b5756b00785983dcTimo Sirainen Pretty much the only real reason to return 0 is if you wish to send more
7d6389e4053c2dac1fb37180b5756b00785983dcTimo Sirainen data to client which isn't buffered, eg. o_stream_send_istream(). */
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainentypedef int stream_flush_callback_t(void *context);
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainentypedef void ostream_callback_t(void *context);
22535a9e685e29214082878e37a267157044618eTimo Sirainen/* Create new output stream from given file descriptor.
b321df9603081896b70ec44635af96d674a9839aTimo Sirainen If max_buffer_size is 0, an "optimal" buffer size is used (max 128kB). */
b321df9603081896b70ec44635af96d674a9839aTimo Siraineno_stream_create_fd(int fd, size_t max_buffer_size, bool autoclose_fd);
b321df9603081896b70ec44635af96d674a9839aTimo Sirainen/* The fd is set to -1 immediately to avoid accidentally closing it twice. */
b321df9603081896b70ec44635af96d674a9839aTimo Sirainenstruct ostream *o_stream_create_fd_autoclose(int *fd, size_t max_buffer_size);
b321df9603081896b70ec44635af96d674a9839aTimo Sirainen/* Create an output stream from a regular file which begins at given offset.
b321df9603081896b70ec44635af96d674a9839aTimo Sirainen If offset==(uoff_t)-1, the current offset isn't known. */
25757faf029c369a8318349dafe952e2358df1d8Timo Siraineno_stream_create_fd_file(int fd, uoff_t offset, bool autoclose_fd);
7d6389e4053c2dac1fb37180b5756b00785983dcTimo Sirainenstruct ostream *o_stream_create_fd_file_autoclose(int *fd, uoff_t offset);
7d6389e4053c2dac1fb37180b5756b00785983dcTimo Sirainen/* Create an output stream to a buffer. */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainenstruct ostream *o_stream_create_buffer(buffer_t *buf);
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen/* Create an output streams that always fails the writes. */
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainenstruct ostream *o_stream_create_error(int stream_errno);
7d6389e4053c2dac1fb37180b5756b00785983dcTimo Siraineno_stream_create_error_str(int stream_errno, const char *fmt, ...)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen/* Create an output stream that simply passes through data. This is mainly
25ee72451d16374ed27fdbf829f4ec756c778352Timo Sirainen useful as a wrapper when combined with destroy callbacks. */
25ee72451d16374ed27fdbf829f4ec756c778352Timo Sirainenstruct ostream *o_stream_create_passthrough(struct ostream *output);
25ee72451d16374ed27fdbf829f4ec756c778352Timo Sirainen/* Set name (e.g. path) for output stream. */
25ee72451d16374ed27fdbf829f4ec756c778352Timo Sirainenvoid o_stream_set_name(struct ostream *stream, const char *name);
25ee72451d16374ed27fdbf829f4ec756c778352Timo Sirainen/* Get output stream's name. Returns "" if stream has no name. */
25ee72451d16374ed27fdbf829f4ec756c778352Timo Sirainenconst char *o_stream_get_name(struct ostream *stream);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen/* Return file descriptor for stream, or -1 if none is available. */
25ee72451d16374ed27fdbf829f4ec756c778352Timo Sirainen/* Returns error string for the previous error. */
25ee72451d16374ed27fdbf829f4ec756c778352Timo Sirainenconst char *o_stream_get_error(struct ostream *stream);
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen/* Close this stream (but not its parents) and unreference it. */
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainenvoid o_stream_destroy(struct ostream **stream);
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen/* Reference counting. References start from 1, so calling o_stream_unref()
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen destroys the stream if o_stream_ref() is never used. */
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen/* Unreferences the stream and sets stream pointer to NULL. */
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen/* Call the given callback function when stream is destroyed. */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainenvoid o_stream_add_destroy_callback(struct ostream *stream,
157bce86d0a01477bb8ebd0d380e6b2297f326f7Timo Sirainen#define o_stream_add_destroy_callback(stream, callback, context) \
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen CALLBACK_TYPECHECK(callback, void (*)(typeof(context))), \
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen/* Remove the destroy callback. */
1e21e6be70994b1aa9e52ca0e2f51afefca6d0dfTimo Sirainenvoid o_stream_remove_destroy_callback(struct ostream *stream,
unsigned int iov_count);
unsigned int iov_count);