iostream-rawlog.c revision b367011da1a2ba3e9113dfbc601aaa4b6b04317d
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen/* Copyright (c) 2011-2013 Dovecot authors, see the included COPYING file */
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainenrawlog_write(struct rawlog_iostream *rstream, const void *data, size_t size)
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen if (write_full(rstream->rawlog_fd, data, size) < 0) {
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen i_error("rawlog_istream.write(%s) failed: %m",
e815af0640b38444b31eadfaa1673bcb422e1573Timo Sirainenrawlog_write_timestamp(struct rawlog_iostream *rstream, bool line_ends)
e815af0640b38444b31eadfaa1673bcb422e1573Timo Sirainen unsigned char data[MAX_INT_STRLEN + 6 + 1 + 3];
e815af0640b38444b31eadfaa1673bcb422e1573Timo Sirainen if ((rstream->flags & IOSTREAM_RAWLOG_FLAG_TIMESTAMP) == 0)
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen buffer_create_from_data(&buf, data, sizeof(data));
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen if ((rstream->flags & IOSTREAM_RAWLOG_FLAG_BUFFERED) != 0) {
14175321ddb88619015866978c05a27786ca4814Timo Sirainen str_append_c(&buf, rstream->input ? 'I' : 'O');
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen return rawlog_write(rstream, buf.data, buf.used);
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainenvoid iostream_rawlog_init(struct rawlog_iostream *rstream,
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen if ((rstream->flags & IOSTREAM_RAWLOG_FLAG_BUFFERED) != 0)
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen rstream->buffer = buffer_create_dynamic(default_pool, 1024);
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Siraineniostream_rawlog_write_unbuffered(struct rawlog_iostream *rstream,
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen if (rawlog_write_timestamp(rstream, TRUE) < 0)
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen if (rawlog_write(rstream, data + start, i - start) < 0 ||
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen if (rawlog_write(rstream, data + start, size - start) < 0)
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen rstream->line_continued = data[size-1] != '\n';
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainenvoid iostream_rawlog_write(struct rawlog_iostream *rstream,
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen const unsigned char *p;
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen if ((rstream->flags & IOSTREAM_RAWLOG_FLAG_BUFFERED) == 0) {
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen iostream_rawlog_write_unbuffered(rstream, data, size);
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen while (rstream->rawlog_fd != -1 && size > 0) {
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen } else if (rstream->buffer->used + size < RAWLOG_MAX_LINE_LEN) {
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen if (rawlog_write_timestamp(rstream, line_ends) < 0)
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen if (rawlog_write(rstream, rstream->buffer->data,
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainenvoid iostream_rawlog_close(struct rawlog_iostream *rstream)
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen if ((rstream->flags & IOSTREAM_RAWLOG_FLAG_AUTOCLOSE) != 0 &&
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen i_error("rawlog_istream.close(%s) failed: %m",
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainenint iostream_rawlog_create(const char *dir, struct istream **input,
static unsigned int counter = 0;
counter++;
int fd;