ostream-rawlog.c revision 3f7b9d04c1fb9b0a55ea2082214ea66a0ace96c7
f8740ac53310cd28ba4ec6dc9e9ce6e9a3688f39Timo Sirainen/* Copyright (c) 2011-2012 Dovecot authors, see the included COPYING file */
f8740ac53310cd28ba4ec6dc9e9ce6e9a3688f39Timo Sirainen
f8740ac53310cd28ba4ec6dc9e9ce6e9a3688f39Timo Sirainen#include "lib.h"
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen#include "iostream-rawlog-private.h"
f8740ac53310cd28ba4ec6dc9e9ce6e9a3688f39Timo Sirainen#include "ostream-private.h"
f8740ac53310cd28ba4ec6dc9e9ce6e9a3688f39Timo Sirainen#include "ostream-rawlog.h"
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainenstruct rawlog_ostream {
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen struct ostream_private ostream;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen struct rawlog_iostream riostream;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen};
7000810786f2959f02cd6d2f4151a9eb61ff5db8Timo Sirainen
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainenstatic void o_stream_rawlog_close(struct iostream_private *stream)
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen{
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen struct rawlog_ostream *rstream = (struct rawlog_ostream *)stream;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen (void)o_stream_flush(rstream->ostream.parent);
7000810786f2959f02cd6d2f4151a9eb61ff5db8Timo Sirainen iostream_rawlog_close(&rstream->riostream);
7000810786f2959f02cd6d2f4151a9eb61ff5db8Timo Sirainen}
7000810786f2959f02cd6d2f4151a9eb61ff5db8Timo Sirainen
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainenstatic ssize_t
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Siraineno_stream_rawlog_sendv(struct ostream_private *stream,
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen const struct const_iovec *iov, unsigned int iov_count)
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen{
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen struct rawlog_ostream *rstream = (struct rawlog_ostream *)stream;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen unsigned int i;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen ssize_t ret, bytes;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen if ((ret = o_stream_sendv(stream->parent, iov, iov_count)) < 0) {
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen o_stream_copy_error_from_parent(stream);
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen return -1;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen }
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen bytes = ret;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen for (i = 0; i < iov_count && bytes > 0; i++) {
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen if (iov[i].iov_len < (size_t)bytes) {
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen iostream_rawlog_write(&rstream->riostream,
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen iov[i].iov_base, iov[i].iov_len);
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen bytes -= iov[i].iov_len;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen } else {
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen iostream_rawlog_write(&rstream->riostream,
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen iov[i].iov_base, bytes);
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen break;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen }
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen }
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen stream->ostream.offset += ret;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen return ret;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen}
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainenstruct ostream *
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Siraineno_stream_create_rawlog(struct ostream *output, const char *rawlog_path,
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen int rawlog_fd, enum iostream_rawlog_flags flags)
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen{
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen struct rawlog_ostream *rstream;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen
7000810786f2959f02cd6d2f4151a9eb61ff5db8Timo Sirainen i_assert(rawlog_path != NULL);
7000810786f2959f02cd6d2f4151a9eb61ff5db8Timo Sirainen i_assert(rawlog_fd != -1);
7000810786f2959f02cd6d2f4151a9eb61ff5db8Timo Sirainen
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen rstream = i_new(struct rawlog_ostream, 1);
7000810786f2959f02cd6d2f4151a9eb61ff5db8Timo Sirainen rstream->ostream.sendv = o_stream_rawlog_sendv;
7000810786f2959f02cd6d2f4151a9eb61ff5db8Timo Sirainen rstream->ostream.iostream.close = o_stream_rawlog_close;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen rstream->riostream.rawlog_path = i_strdup(rawlog_path);
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen rstream->riostream.rawlog_fd = rawlog_fd;
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen iostream_rawlog_init(&rstream->riostream, flags, FALSE);
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen return o_stream_create(&rstream->ostream, output, -1);
d6a7cb184cc882a90aa3d9312082e0029f354ff6Timo Sirainen}
7000810786f2959f02cd6d2f4151a9eb61ff5db8Timo Sirainen