istream-file.c revision c09f9f95db314e7482c95e502e1c56ed6c555797
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
46552a931924c2d743f045e95b08c3ce6beda91aTimo Sirainen/* @UNSAFE: whole file */
3612ee5c737954d5fb88fd1775aad80f7bf1dc4eTimo Sirainenstatic void i_stream_file_close(struct iostream_private *stream)
3612ee5c737954d5fb88fd1775aad80f7bf1dc4eTimo Sirainen struct file_istream *fstream = (struct file_istream *)stream;
3612ee5c737954d5fb88fd1775aad80f7bf1dc4eTimo Sirainen struct istream_private *_stream = (struct istream_private *)stream;
3612ee5c737954d5fb88fd1775aad80f7bf1dc4eTimo Sirainen if (fstream->autoclose_fd && _stream->fd != -1) {
89795c6bbbc52bb382e88bc8617d22092223e9a5Timo Sirainenstatic void i_stream_file_destroy(struct iostream_private *stream)
493123e38ca1f27b07ac30dcbc59663c5fcdcba2Timo Sirainen struct istream_private *_stream = (struct istream_private *)stream;
89795c6bbbc52bb382e88bc8617d22092223e9a5Timo Sirainenstatic ssize_t i_stream_file_read(struct istream_private *stream)
ddbdc644a15f56f4b43596f1b8c0fc196c101445Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen if (!i_stream_get_buffer_space(stream, 1, &size))
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen ret = pread(stream->fd, stream->w_buffer + stream->pos,
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomi /* don't try to read() again. EOF from keyboard (^D)
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomi requires this to work right. */
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomi ret = read(stream->fd, stream->w_buffer + stream->pos,
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomi if (ret == 0) {
686ad6d723004b807fd558f3ef9d1f88afa7e127Timo Sirainenstatic void i_stream_file_seek(struct istream_private *stream, uoff_t v_offset,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen fstream->skip_left += v_offset - stream->istream.v_offset;
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainenstatic void i_stream_file_sync(struct istream_private *stream)
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* can't do anything or data would be lost */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainenstatic const struct stat *
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Siraineni_stream_file_stat(struct istream_private *stream, bool exact ATTR_UNUSED)
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainen if (fstat(fstream->istream.fd, &fstream->istream.statbuf) < 0) {
3cb26db7f4756b71ba06c6e4950fa4f8ce7fad66Timo Sirainenstruct istream *i_stream_create_fd(int fd, size_t max_buffer_size,
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen fstream->istream.iostream.close = i_stream_file_close;
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen fstream->istream.iostream.destroy = i_stream_file_destroy;
53d564c421ca7292d7b1bd945f86894a34b75370Timo Sirainen fstream->istream.max_buffer_size = max_buffer_size;
5324117274df8564eeaebe369cb1eca76edb3165Timo Sirainen /* if it's a file, set the flags properly */
5324117274df8564eeaebe369cb1eca76edb3165Timo Sirainen if (fstat(fd, &st) == 0 && S_ISREG(st.st_mode)) {