ostream.c revision 3ed2d0f6b5e67e2663d44489d9da3176823789a8
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschvoid o_stream_set_name(struct ostream *stream, const char *name)
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch stream->real_stream->iostream.name = i_strdup(name);
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Boschconst char *o_stream_get_name(struct ostream *stream)
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch return stream->real_stream->iostream.name == NULL ? "" :
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch io_stream_ref(&stream->real_stream->iostream);
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch io_stream_unref(&(*stream)->real_stream->iostream);
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch io_stream_close(&stream->real_stream->iostream);
38af46387e565053adf6c47f7f6871676d685de8Stephan Boschvoid o_stream_set_flush_callback(struct ostream *stream,
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch struct ostream_private *_stream = stream->real_stream;
38af46387e565053adf6c47f7f6871676d685de8Stephan Boschvoid o_stream_unset_flush_callback(struct ostream *stream)
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch struct ostream_private *_stream = stream->real_stream;
38af46387e565053adf6c47f7f6871676d685de8Stephan Boschvoid o_stream_set_max_buffer_size(struct ostream *stream, size_t max_size)
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch if (stream->real_stream->iostream.set_max_buffer_size != NULL) {
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch io_stream_set_max_buffer_size(&stream->real_stream->iostream,
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch stream->real_stream->max_buffer_size = max_size;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch struct ostream_private *_stream = stream->real_stream;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch struct ostream_private *_stream = stream->real_stream;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch struct ostream_private *_stream = stream->real_stream;
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch if (unlikely((ret = _stream->flush(_stream)) < 0)) {
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch stream->last_failed_errno = stream->stream_errno;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschvoid o_stream_set_flush_pending(struct ostream *stream, bool set)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch struct ostream_private *_stream = stream->real_stream;
faa8995f1d300e7a8917407a52bbd1b98e10bf25Timo Sirainensize_t o_stream_get_buffer_used_size(const struct ostream *stream)
faa8995f1d300e7a8917407a52bbd1b98e10bf25Timo Sirainen const struct ostream_private *_stream = stream->real_stream;
ee2633056e67353157bfbce4d9e0d1c3ceaa627aStephan Boschsize_t o_stream_get_buffer_avail_size(const struct ostream *stream)
ee2633056e67353157bfbce4d9e0d1c3ceaa627aStephan Bosch size_t used = o_stream_get_buffer_used_size(stream);
14bd2410de3a0261d9c53c6120915027262216bdTimo Sirainen return stream->real_stream->max_buffer_size <= used ? 0 :
9f8cef4cbc49797053c343209ea13022fdbc5a63Stephan Boschint o_stream_seek(struct ostream *stream, uoff_t offset)
9f8cef4cbc49797053c343209ea13022fdbc5a63Stephan Bosch struct ostream_private *_stream = stream->real_stream;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch if (unlikely(_stream->seek(_stream, offset) < 0)) {
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch stream->last_failed_errno = stream->stream_errno;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschssize_t o_stream_send(struct ostream *stream, const void *data, size_t size)
ee2633056e67353157bfbce4d9e0d1c3ceaa627aStephan Boschssize_t o_stream_sendv(struct ostream *stream, const struct const_iovec *iov,
ee2633056e67353157bfbce4d9e0d1c3ceaa627aStephan Bosch struct ostream_private *_stream = stream->real_stream;
ee2633056e67353157bfbce4d9e0d1c3ceaa627aStephan Bosch unsigned int i;
ee2633056e67353157bfbce4d9e0d1c3ceaa627aStephan Bosch for (i = 0, total_size = 0; i < iov_count; i++)
ee2633056e67353157bfbce4d9e0d1c3ceaa627aStephan Bosch ret = _stream->sendv(_stream, iov, iov_count);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch stream->last_failed_errno = stream->stream_errno;
91a482473f200152d6713181c0e36f7a4f03ef6dTimo Sirainenssize_t o_stream_send_str(struct ostream *stream, const char *str)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch return o_stream_send(stream, str, strlen(str));
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschoff_t o_stream_send_istream(struct ostream *outstream,
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch struct ostream_private *_outstream = outstream->real_stream;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch if (unlikely(outstream->closed || instream->closed))
85f3bd5926fff0e70b6d259a5c8074bd8cdeb9adTimo Sirainen ret = _outstream->send_istream(_outstream, instream);
564e117d86ce5b659f9b9570edddc566f9ebb5dfStephan Boschint o_stream_pwrite(struct ostream *stream, const void *data, size_t size,
564e117d86ce5b659f9b9570edddc566f9ebb5dfStephan Bosch /* stream doesn't support seeking */
564e117d86ce5b659f9b9570edddc566f9ebb5dfStephan Bosch ret = stream->real_stream->write_at(stream->real_stream,
93ed69606237a08623f8294c060fa148880058f8Timo Sirainen stream->last_failed_errno = stream->stream_errno;
9ec9b6f85c8fbe67bfac523a5e3d33d34f72dddcStephan Boschstatic off_t o_stream_default_send_istream(struct ostream_private *outstream,
9ec9b6f85c8fbe67bfac523a5e3d33d34f72dddcStephan Bosch return io_stream_copy(&outstream->ostream, instream, IO_BLOCK_SIZE);
9ec9b6f85c8fbe67bfac523a5e3d33d34f72dddcStephan Boschstruct ostream *o_stream_create(struct ostream_private *_stream)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch _stream->send_istream = o_stream_default_send_istream;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschoff_t io_stream_copy(struct ostream *outstream, struct istream *instream,
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch const unsigned char *data;
711e8e4c5c5d702dfa062f42a1ede5de14c151c9Stephan Bosch (void)i_stream_read_data(instream, &data, &iov.iov_len,
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch /* all sent */