From: Timo Sirainen Date: Sat, 6 Mar 2010 11:56:09 +0000 (+0200) Subject: i/ostreams can now have a name (e.g. file path). X-Git-Tag: 2.0.beta4~121 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8cb72c59d5ea4e9e5f638d7ec840bb853f5a188e;p=thirdparty%2Fdovecot%2Fcore.git i/ostreams can now have a name (e.g. file path). --HG-- branch : HEAD --- diff --git a/src/lib/iostream-internal.h b/src/lib/iostream-internal.h index 042690c065..1d5f0cc89c 100644 --- a/src/lib/iostream-internal.h +++ b/src/lib/iostream-internal.h @@ -5,6 +5,7 @@ struct iostream_private { int refcount; + char *name; void (*close)(struct iostream_private *stream); void (*destroy)(struct iostream_private *stream); diff --git a/src/lib/iostream.c b/src/lib/iostream.c index 817755aa9e..5f15da6420 100644 --- a/src/lib/iostream.c +++ b/src/lib/iostream.c @@ -34,6 +34,7 @@ void io_stream_unref(struct iostream_private *stream) stream->destroy_callback(stream->destroy_context); stream->destroy(stream); + i_free(stream->name); i_free(stream); } diff --git a/src/lib/istream-file.c b/src/lib/istream-file.c index 077eb20908..6e78162ce6 100644 --- a/src/lib/istream-file.c +++ b/src/lib/istream-file.c @@ -27,8 +27,10 @@ static void i_stream_file_close(struct iostream_private *stream) struct istream_private *_stream = (struct istream_private *)stream; if (fstream->autoclose_fd && _stream->fd != -1) { - if (close(_stream->fd) < 0) - i_error("file_istream.close() failed: %m"); + if (close(_stream->fd) < 0) { + i_error("file_istream.close(%s) failed: %m", + i_stream_get_name(&_stream->istream)); + } } _stream->fd = -1; } @@ -130,7 +132,8 @@ i_stream_file_stat(struct istream_private *stream, bool exact ATTR_UNUSED) if (fstream->file) { if (fstat(fstream->istream.fd, &fstream->istream.statbuf) < 0) { - i_error("file_istream.fstat() failed: %m"); + i_error("file_istream.fstat(%s) failed: %m", + i_stream_get_name(&stream->istream)); return NULL; } } diff --git a/src/lib/istream-mmap.c b/src/lib/istream-mmap.c index 6dd8c2e203..3d795c3cdd 100644 --- a/src/lib/istream-mmap.c +++ b/src/lib/istream-mmap.c @@ -27,8 +27,10 @@ static void i_stream_mmap_close(struct iostream_private *stream) struct mmap_istream *mstream = (struct mmap_istream *) stream; if (mstream->autoclose_fd && mstream->istream.fd != -1) { - if (close(mstream->istream.fd) < 0) - i_error("mmap_istream.close() failed: %m"); + if (close(mstream->istream.fd) < 0) { + i_error("mmap_istream.close(%s) failed: %m", + i_stream_get_name(&mstream->istream.istream)); + } } mstream->istream.fd = -1; } @@ -38,8 +40,10 @@ static void i_stream_munmap(struct mmap_istream *mstream) struct istream_private *_stream = &mstream->istream; if (_stream->buffer != NULL) { - if (munmap(mstream->mmap_base, _stream->buffer_size) < 0) - i_error("mmap_istream.munmap() failed: %m"); + if (munmap(mstream->mmap_base, _stream->buffer_size) < 0) { + i_error("mmap_istream.munmap(%s) failed: %m", + i_stream_get_name(&_stream->istream)); + } mstream->mmap_base = NULL; _stream->buffer = NULL; _stream->buffer_size = 0; @@ -87,8 +91,10 @@ static ssize_t i_stream_mmap_read(struct istream_private *stream) mstream->mmap_offset += aligned_skip; if (mstream->mmap_base != NULL) { - if (munmap(mstream->mmap_base, stream->buffer_size) < 0) - i_error("io_stream_read_mmaped(): munmap() failed: %m"); + if (munmap(mstream->mmap_base, stream->buffer_size) < 0) { + i_error("mmap_istream.munmap(%s) failed: %m", + i_stream_get_name(&stream->istream)); + } } top = mstream->v_size - mstream->mmap_offset; @@ -112,7 +118,8 @@ static ssize_t i_stream_mmap_read(struct istream_private *stream) stream->buffer = NULL; stream->buffer_size = 0; stream->skip = stream->pos = 0; - i_error("mmap_istream.mmap() failed: %m"); + i_error("mmap_istream.mmap(%s) failed: %m", + i_stream_get_name(&stream->istream)); return -1; } stream->buffer = mstream->mmap_base; @@ -120,8 +127,10 @@ static ssize_t i_stream_mmap_read(struct istream_private *stream) if (stream->buffer_size > mmap_get_page_size()) { if (madvise(mstream->mmap_base, stream->buffer_size, - MADV_SEQUENTIAL) < 0) - i_error("mmap_istream.madvise(): %m"); + MADV_SEQUENTIAL) < 0) { + i_error("mmap_istream.madvise(%s): %m", + i_stream_get_name(&stream->istream)); + } } stream->pos = stream->buffer_size; @@ -165,7 +174,8 @@ static int fstat_cached(struct mmap_istream *mstream) return 0; if (fstat(mstream->istream.fd, &mstream->istream.statbuf) < 0) { - i_error("mmap_istream.fstat() failed: %m"); + i_error("mmap_istream.fstat(%s) failed: %m", + i_stream_get_name(&mstream->istream.istream)); return -1; } diff --git a/src/lib/istream-seekable.c b/src/lib/istream-seekable.c index 790b68701c..f182488161 100644 --- a/src/lib/istream-seekable.c +++ b/src/lib/istream-seekable.c @@ -105,7 +105,8 @@ static int copy_to_temp_file(struct seekable_istream *sstream) if (i_stream_read(sstream->fd_input) <= 0) { i_error("istream-seekable: Couldn't read back " - "in-memory input"); + "in-memory input %s", + i_stream_get_name(&stream->istream)); i_stream_destroy(&sstream->fd_input); return -1; } diff --git a/src/lib/istream.c b/src/lib/istream.c index 601b9c7e90..ba5955c9df 100644 --- a/src/lib/istream.c +++ b/src/lib/istream.c @@ -5,6 +5,22 @@ #include "str.h" #include "istream-internal.h" +void i_stream_set_name(struct istream *stream, const char *name) +{ + i_free(stream->real_stream->iostream.name); + stream->real_stream->iostream.name = i_strdup(name); +} + +const char *i_stream_get_name(struct istream *stream) +{ + while (stream->real_stream->iostream.name == NULL) { + stream = stream->real_stream->parent; + if (stream == NULL) + return ""; + } + return stream->real_stream->iostream.name; +} + void i_stream_destroy(struct istream **stream) { i_stream_close(*stream); @@ -324,7 +340,8 @@ char *i_stream_next_line(struct istream *stream) } if (unlikely(_stream->w_buffer == NULL)) { - i_error("i_stream_next_line() called for unmodifiable stream"); + i_error("i_stream_next_line(%s) called for unmodifiable stream", + i_stream_get_name(stream)); return NULL; } diff --git a/src/lib/istream.h b/src/lib/istream.h index 9d8bdd1de1..648decf33f 100644 --- a/src/lib/istream.h +++ b/src/lib/istream.h @@ -30,6 +30,13 @@ struct istream *i_stream_create_mmap(int fd, size_t block_size, struct istream *i_stream_create_from_data(const void *data, size_t size); struct istream *i_stream_create_limit(struct istream *input, uoff_t v_size); +/* Set name (e.g. path) for input stream. */ +void i_stream_set_name(struct istream *stream, const char *name); +/* Get input stream's name. If stream itself doesn't have a name, + it looks up further into stream's parents until one of them has a name. + Returns "" if stream has no name. */ +const char *i_stream_get_name(struct istream *stream); + /* i_stream_close() + i_stream_unref() */ void i_stream_destroy(struct istream **stream); diff --git a/src/lib/ostream-file.c b/src/lib/ostream-file.c index 1d2ee824f4..953d6dd01e 100644 --- a/src/lib/ostream-file.c +++ b/src/lib/ostream-file.c @@ -57,8 +57,10 @@ static void stream_closed(struct file_ostream *fstream) io_remove(&fstream->io); if (fstream->autoclose_fd && fstream->fd != -1) { - if (close(fstream->fd) < 0) - i_error("file_ostream.close() failed: %m"); + if (close(fstream->fd) < 0) { + i_error("file_ostream.close(%s) failed: %m", + o_stream_get_name(&fstream->ostream.ostream)); + } } fstream->fd = -1; diff --git a/src/lib/ostream.c b/src/lib/ostream.c index 1e5a985c6d..28ff49f1df 100644 --- a/src/lib/ostream.c +++ b/src/lib/ostream.c @@ -4,6 +4,18 @@ #include "istream.h" #include "ostream-internal.h" +void o_stream_set_name(struct ostream *stream, const char *name) +{ + i_free(stream->real_stream->iostream.name); + stream->real_stream->iostream.name = i_strdup(name); +} + +const char *o_stream_get_name(struct ostream *stream) +{ + return stream->real_stream->iostream.name == NULL ? "" : + stream->real_stream->iostream.name; +} + void o_stream_destroy(struct ostream **stream) { o_stream_close(*stream); diff --git a/src/lib/ostream.h b/src/lib/ostream.h index d28e8a0c2d..9d0fe7fd5c 100644 --- a/src/lib/ostream.h +++ b/src/lib/ostream.h @@ -37,6 +37,11 @@ o_stream_create_fd_file(int fd, uoff_t offset, bool autoclose_fd); /* Create an output stream to a buffer. */ struct ostream *o_stream_create_buffer(buffer_t *buf); +/* Set name (e.g. path) for output stream. */ +void o_stream_set_name(struct ostream *stream, const char *name); +/* Get output stream's name. Returns "" if stream has no name. */ +const char *o_stream_get_name(struct ostream *stream); + /* o_stream_close() + o_stream_unref() */ void o_stream_destroy(struct ostream **stream); /* Reference counting. References start from 1, so calling o_stream_unref()