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