ostream-rawlog.c revision f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2011-2012 Dovecot authors, see the included COPYING file */
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#include "iostream-rawlog-private.h"
d9076f5939edf5d20a261494b1a861dcbb0d32e2Timo Sirainen#include "ostream-private.h"
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen#include "ostream-rawlog.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
5666a3d6a7ea89362b8d9e8b39b15424cd9d6388Timo Sirainenstruct rawlog_ostream {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct ostream_private ostream;
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch struct rawlog_iostream riostream;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainenstatic void o_stream_rawlog_close(struct iostream_private *stream)
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainen{
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainen struct rawlog_ostream *rstream = (struct rawlog_ostream *)stream;
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen (void)o_stream_flush(rstream->ostream.parent);
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen iostream_rawlog_close(&rstream->riostream);
3ed2d0f6b5e67e2663d44489d9da3176823789a8Timo Sirainen}
65f8fb656051f1059f7b5a2da9c5555adcc30439Timo Sirainen
1a5573ebc32fae2fe576ec544e1781323c1db609Timo Sirainenstatic ssize_t
1a5573ebc32fae2fe576ec544e1781323c1db609Timo Siraineno_stream_rawlog_sendv(struct ostream_private *stream,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen const struct const_iovec *iov, unsigned int iov_count)
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen{
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct rawlog_ostream *rstream = (struct rawlog_ostream *)stream;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen unsigned int i;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen ssize_t ret;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen for (i = 0; i < iov_count; i++) {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen iostream_rawlog_write(&rstream->riostream,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen iov[i].iov_base, iov[i].iov_len);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen }
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen if ((ret = o_stream_sendv(stream->parent, iov, iov_count)) < 0) {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen o_stream_copy_error_from_parent(stream);
2dd39e478269d6fb0bb26d12b394aa30ee965e38Timo Sirainen return -1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen stream->ostream.offset += ret;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return ret;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen}
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenstruct ostream *
2615df45a8027948a474abe5e817b34b0499c171Timo Siraineno_stream_create_rawlog(struct ostream *output, const char *rawlog_path,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int rawlog_fd, enum iostream_rawlog_flags flags)
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen{
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen struct rawlog_ostream *rstream;
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen i_assert(rawlog_path != NULL);
3e564425db51f3921ce4de11859777135fdedd15Timo Sirainen i_assert(rawlog_fd != -1);
857c471c13ca215f4be9dd4b336b742b8d434e31Timo Sirainen
857c471c13ca215f4be9dd4b336b742b8d434e31Timo Sirainen rstream = i_new(struct rawlog_ostream, 1);
857c471c13ca215f4be9dd4b336b742b8d434e31Timo Sirainen rstream->ostream.sendv = o_stream_rawlog_sendv;
857c471c13ca215f4be9dd4b336b742b8d434e31Timo Sirainen rstream->ostream.iostream.close = o_stream_rawlog_close;
857c471c13ca215f4be9dd4b336b742b8d434e31Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen rstream->riostream.rawlog_path = i_strdup(rawlog_path);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen rstream->riostream.rawlog_fd = rawlog_fd;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen iostream_rawlog_init(&rstream->riostream, flags, FALSE);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen return o_stream_create(&rstream->ostream, output, -1);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen}
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen