ostream-rawlog.c revision 6a9bd9f9e6f3af9362160fdc886de116e4b08e9a
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2011-2013 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen#include "iostream-rawlog-private.h"
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen#include "ostream-private.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "ostream-rawlog.h"
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainenstruct rawlog_ostream {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct ostream_private ostream;
89b548af722113acb5d63dfffb44423cb60f91e4Timo Sirainen struct rawlog_iostream riostream;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void o_stream_rawlog_close(struct iostream_private *stream)
66ae183b6e895216037bd921367670f4b0665911Timo Sirainen{
e86d0d34fe365da4c7ca4312d575bfcbf3a01c0eTimo Sirainen struct rawlog_ostream *rstream = (struct rawlog_ostream *)stream;
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (void)o_stream_flush(rstream->ostream.parent);
da5d50534cfca45d0aaaf0bdac17b287b4588809Timo Sirainen iostream_rawlog_close(&rstream->riostream);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen o_stream_close(rstream->ostream.parent);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainenstatic ssize_t
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Siraineno_stream_rawlog_sendv(struct ostream_private *stream,
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen const struct const_iovec *iov, unsigned int iov_count)
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct rawlog_ostream *rstream = (struct rawlog_ostream *)stream;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int i;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ssize_t ret, bytes;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ((ret = o_stream_sendv(stream->parent, iov, iov_count)) < 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen o_stream_copy_error_from_parent(stream);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return -1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen bytes = ret;
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen for (i = 0; i < iov_count && bytes > 0; i++) {
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen if (iov[i].iov_len < (size_t)bytes) {
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen iostream_rawlog_write(&rstream->riostream,
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen iov[i].iov_base, iov[i].iov_len);
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen bytes -= iov[i].iov_len;
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen } else {
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen iostream_rawlog_write(&rstream->riostream,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen iov[i].iov_base, bytes);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen break;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen }
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen }
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen stream->ostream.offset += ret;
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen return ret;
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen}
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainenstruct ostream *
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Siraineno_stream_create_rawlog(struct ostream *output, const char *rawlog_path,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen int rawlog_fd, enum iostream_rawlog_flags flags)
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct rawlog_ostream *rstream;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_assert(rawlog_path != NULL);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen i_assert(rawlog_fd != -1);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen rstream = i_new(struct rawlog_ostream, 1);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen rstream->ostream.sendv = o_stream_rawlog_sendv;
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen rstream->ostream.iostream.close = o_stream_rawlog_close;
ee246b46953e4b94b2f22e093373674fa9155500Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen rstream->riostream.rawlog_path = i_strdup(rawlog_path);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen rstream->riostream.rawlog_fd = rawlog_fd;
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen iostream_rawlog_init(&rstream->riostream, flags, FALSE);
648d24583c1574441c4fa0331a90bd4d6e7996c5Timo Sirainen
648d24583c1574441c4fa0331a90bd4d6e7996c5Timo Sirainen return o_stream_create(&rstream->ostream, output, -1);
ee246b46953e4b94b2f22e093373674fa9155500Timo Sirainen}
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen