]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
i/ostreams can now have a name (e.g. file path).
authorTimo Sirainen <tss@iki.fi>
Sat, 6 Mar 2010 11:56:09 +0000 (13:56 +0200)
committerTimo Sirainen <tss@iki.fi>
Sat, 6 Mar 2010 11:56:09 +0000 (13:56 +0200)
--HG--
branch : HEAD

src/lib/iostream-internal.h
src/lib/iostream.c
src/lib/istream-file.c
src/lib/istream-mmap.c
src/lib/istream-seekable.c
src/lib/istream.c
src/lib/istream.h
src/lib/ostream-file.c
src/lib/ostream.c
src/lib/ostream.h

index 042690c06501a9c6f445a4d0d22d5a89571d1223..1d5f0cc89c72882a755bee88abe7ef402f77366e 100644 (file)
@@ -5,6 +5,7 @@
 
 struct iostream_private {
        int refcount;
+       char *name;
 
        void (*close)(struct iostream_private *stream);
        void (*destroy)(struct iostream_private *stream);
index 817755aa9e2f793831f37d1fc65128cd7771b437..5f15da6420b3e99693488a76234bc8f9784eb5b4 100644 (file)
@@ -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);
 }
 
index 077eb20908a32c30988d2afd9b7b004290f38f45..6e78162ce6d45cbe30b7c3ab703d43c25aacc42e 100644 (file)
@@ -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;
                }
        }
index 6dd8c2e203bd4305c2fc9bbd9b9181d01875bc60..3d795c3cdd0b54c02e32bf48f45127adb68af7ee 100644 (file)
@@ -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;
        }
 
index 790b68701c431c9557780dd47813770f3a7305c0..f18248816169961684bb23d2d7bfb9f24696b2dc 100644 (file)
@@ -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;
                }
index 601b9c7e9084e1fd38442943501d538696bd65aa..ba5955c9df5aff2dedddb635f3aff55bb0ebfe4e 100644 (file)
@@ -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;
        }
 
index 9d8bdd1de154c84459ea0c6e77dc28281a9b0bd0..648decf33f52f660839d15fc8366be64a778f738 100644 (file)
@@ -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);
 
index 1d2ee824f40fa141db9f230c2806547387cccfac..953d6dd01e870096edea38ff09f3031a867dc7ef 100644 (file)
@@ -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;
 
index 1e5a985c6d7f5798fbd3d07205fdf8a03c612ab9..28ff49f1df60506d6e16c4ddd26db18984000164 100644 (file)
@@ -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);
index d28e8a0c2d77a5533916456b8c0b889a5f94595c..9d0fe7fd5ccb01d2b9f73c152dae20c757007f34 100644 (file)
@@ -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()