summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
authorMohammad AlSaleh <CE.Mohammad.AlSaleh@gmail.com>2024-04-04 10:23:00 +0300
committerKacper Michajłow <kasper93@gmail.com>2024-05-07 12:22:09 +0200
commitbb7a485c0932375b888a61966970696c06851a15 (patch)
tree0bffd104d6360e229d605fc8b49fb0c07a8d0733 /stream
parent4e59a568963ba3a41d92d863786b88cb6ee17348 (diff)
downloadmpv-bb7a485c0932375b888a61966970696c06851a15.tar.bz2
mpv-bb7a485c0932375b888a61966970696c06851a15.tar.xz
stream: don't try to read from all-sparse/no-data files
``` dd if=/dev/zero of=/tmp/10g.empty bs=1 seek=10G count=0 dd if=/dev/zero of=/tmp/10m.empty bs=1 seek=10M count=0 time mpv /tmp/10{g,m}.empty ``` I keep files with the name format `${name}-${hash}.${ext}.empty` around, where the original is removed, and a sparse file with the size of the original is created instead. A lot of time is wasted on such files when going through playlists/directories that include some of them. This admittedly may not be that common of a use-case. Signed-off-by: Mohammad AlSaleh <CE.Mohammad.AlSaleh@gmail.com>
Diffstat (limited to 'stream')
-rw-r--r--stream/stream_file.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/stream/stream_file.c b/stream/stream_file.c
index 1744fc13a4..0a6a697ff6 100644
--- a/stream/stream_file.c
+++ b/stream/stream_file.c
@@ -358,6 +358,17 @@ static int open_f(stream_t *stream, const struct stream_open_args *args)
setmode(p->fd, O_BINARY);
#endif
+#if HAVE_SEEK_DATA
+ if (stream->mode == STREAM_READ) {
+ off_t first_data = lseek(p->fd, 0, SEEK_DATA);
+ if (first_data == (off_t)-1 && errno == ENXIO) {
+ MP_ERR(stream, "File is empty or all sparse (has no data).\n");
+ s_close(stream);
+ return STREAM_ERROR;
+ }
+ }
+#endif
+
off_t len = lseek(p->fd, 0, SEEK_END);
lseek(p->fd, 0, SEEK_SET);
if (len != (off_t)-1) {