]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
istream-mmap: Mark stream eof on error and copy errno
authorAki Tuomi <aki.tuomi@dovecot.fi>
Sun, 25 Dec 2016 08:14:07 +0000 (10:14 +0200)
committerGitLab <gitlab@git.dovecot.net>
Sat, 7 Jan 2017 16:57:43 +0000 (18:57 +0200)
src/lib/istream-mmap.c

index 86300fca365fa5665413a52028e5c7ddc9632236..85284c07d37bd1e481f2cc8ef6558c1aa45da9cb 100644 (file)
@@ -179,6 +179,7 @@ static int fstat_cached(struct mmap_istream *mstream)
        if (fstat(mstream->istream.fd, &mstream->istream.statbuf) < 0) {
                i_error("mmap_istream.fstat(%s) failed: %m",
                        i_stream_get_name(&mstream->istream.istream));
+               mstream->istream.istream.stream_errno = errno;
                return -1;
        }
 
@@ -205,10 +206,14 @@ struct istream *i_stream_create_mmap(int fd, size_t block_size,
        if (mmap_pagemask == 0)
                mmap_pagemask = mmap_get_page_size()-1;
 
+       mstream = i_new(struct mmap_istream, 1);
+
        if (v_size == 0) {
-               if (fstat(fd, &st) < 0)
+               if (fstat(fd, &st) < 0) {
                        i_error("i_stream_create_mmap(): fstat() failed: %m");
-               else {
+                       mstream->istream.istream.eof = TRUE;
+                       mstream->istream.istream.stream_errno = errno;
+               } else {
                        v_size = st.st_size;
                        if (start_offset > v_size)
                                start_offset = v_size;
@@ -216,7 +221,6 @@ struct istream *i_stream_create_mmap(int fd, size_t block_size,
                }
        }
 
-       mstream = i_new(struct mmap_istream, 1);
        mstream->autoclose_fd = autoclose_fd;
        mstream->v_size = v_size;