From 74a2c0fb7f61ded74b1a66baff61783907433efa Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 16 Feb 2020 16:03:03 +0100 Subject: stream_file: use fstat() instead of lseek() to determine file size It appears using lseek() to seek to the end and back to determine file size is inefficient in some cases (like with CIFS, see #7408). Even Windows supports fstat() (well, almost, but we already have a wrapper), so use that. It's unknown whether that will work better. Although I like it more, because it doesn't mess with the file position. --- stream/stream_file.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/stream/stream_file.c b/stream/stream_file.c index 6e69f33c94..9f83b73dd1 100644 --- a/stream/stream_file.c +++ b/stream/stream_file.c @@ -77,9 +77,14 @@ static int64_t get_size(stream_t *s) { struct priv *p = s->priv; if (p->cached_size == -2) { - off_t size = lseek(p->fd, 0, SEEK_END); - lseek(p->fd, s->pos, SEEK_SET); - p->cached_size = size < 0 ? -1 : size; + int64_t size = -1; + struct stat st; + if (fstat(p->fd, &st) == 0) { + if (st.st_size <= 0 && !s->seekable) + st.st_size = -1; + size = st.st_size < 0 ? -1 : st.st_size; + } + p->cached_size = size; } return p->cached_size; } -- cgit v1.2.3