dovecot-2.0: i/ostreams can now have a name (e.g. file path).
dovecot at dovecot.org
dovecot at dovecot.org
Sat Mar 6 14:05:33 EET 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/5f16e488e7f6
changeset: 10847:5f16e488e7f6
user: Timo Sirainen <tss at iki.fi>
date: Sat Mar 06 13:56:09 2010 +0200
description:
i/ostreams can now have a name (e.g. file path).
diffstat:
src/lib/iostream-internal.h | 1 +
src/lib/iostream.c | 1 +
src/lib/istream-file.c | 9 ++++++---
src/lib/istream-mmap.c | 30 ++++++++++++++++++++----------
src/lib/istream-seekable.c | 3 ++-
src/lib/istream.c | 19 ++++++++++++++++++-
src/lib/istream.h | 7 +++++++
src/lib/ostream-file.c | 6 ++++--
src/lib/ostream.c | 12 ++++++++++++
src/lib/ostream.h | 5 +++++
10 files changed, 76 insertions(+), 17 deletions(-)
diffs (242 lines):
diff -r def12863b620 -r 5f16e488e7f6 src/lib/iostream-internal.h
--- a/src/lib/iostream-internal.h Sat Mar 06 13:33:33 2010 +0200
+++ b/src/lib/iostream-internal.h Sat Mar 06 13:56:09 2010 +0200
@@ -5,6 +5,7 @@
struct iostream_private {
int refcount;
+ char *name;
void (*close)(struct iostream_private *stream);
void (*destroy)(struct iostream_private *stream);
diff -r def12863b620 -r 5f16e488e7f6 src/lib/iostream.c
--- a/src/lib/iostream.c Sat Mar 06 13:33:33 2010 +0200
+++ b/src/lib/iostream.c Sat Mar 06 13:56:09 2010 +0200
@@ -34,6 +34,7 @@
stream->destroy_callback(stream->destroy_context);
stream->destroy(stream);
+ i_free(stream->name);
i_free(stream);
}
diff -r def12863b620 -r 5f16e488e7f6 src/lib/istream-file.c
--- a/src/lib/istream-file.c Sat Mar 06 13:33:33 2010 +0200
+++ b/src/lib/istream-file.c Sat Mar 06 13:56:09 2010 +0200
@@ -27,8 +27,10 @@
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 @@
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 -r def12863b620 -r 5f16e488e7f6 src/lib/istream-mmap.c
--- a/src/lib/istream-mmap.c Sat Mar 06 13:33:33 2010 +0200
+++ b/src/lib/istream-mmap.c Sat Mar 06 13:56:09 2010 +0200
@@ -27,8 +27,10 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 -r def12863b620 -r 5f16e488e7f6 src/lib/istream-seekable.c
--- a/src/lib/istream-seekable.c Sat Mar 06 13:33:33 2010 +0200
+++ b/src/lib/istream-seekable.c Sat Mar 06 13:56:09 2010 +0200
@@ -105,7 +105,8 @@
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 -r def12863b620 -r 5f16e488e7f6 src/lib/istream.c
--- a/src/lib/istream.c Sat Mar 06 13:33:33 2010 +0200
+++ b/src/lib/istream.c Sat Mar 06 13:56:09 2010 +0200
@@ -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 @@
}
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 -r def12863b620 -r 5f16e488e7f6 src/lib/istream.h
--- a/src/lib/istream.h Sat Mar 06 13:33:33 2010 +0200
+++ b/src/lib/istream.h Sat Mar 06 13:56:09 2010 +0200
@@ -30,6 +30,13 @@
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 -r def12863b620 -r 5f16e488e7f6 src/lib/ostream-file.c
--- a/src/lib/ostream-file.c Sat Mar 06 13:33:33 2010 +0200
+++ b/src/lib/ostream-file.c Sat Mar 06 13:56:09 2010 +0200
@@ -57,8 +57,10 @@
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 -r def12863b620 -r 5f16e488e7f6 src/lib/ostream.c
--- a/src/lib/ostream.c Sat Mar 06 13:33:33 2010 +0200
+++ b/src/lib/ostream.c Sat Mar 06 13:56:09 2010 +0200
@@ -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 -r def12863b620 -r 5f16e488e7f6 src/lib/ostream.h
--- a/src/lib/ostream.h Sat Mar 06 13:33:33 2010 +0200
+++ b/src/lib/ostream.h Sat Mar 06 13:56:09 2010 +0200
@@ -37,6 +37,11 @@
/* 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()
More information about the dovecot-cvs
mailing list