summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2018-05-17 12:40:33 +0200
committersfan5 <sfan5@live.de>2018-05-25 10:47:46 +0200
commit5a4a69cb58f78f56f8e45f2b254b9a00e4274cae (patch)
tree461a90b03491f4c339f4c4ec79e93a77f8f3ae01
parentfba98cfb052aed43880aa2cab29bd712a6cfb49c (diff)
downloadmpv-5a4a69cb58f78f56f8e45f2b254b9a00e4274cae.tar.bz2
mpv-5a4a69cb58f78f56f8e45f2b254b9a00e4274cae.tar.xz
stream_file: properly detect stdin as pipe
There is some code that checks a FD for whether it is a regular file or not. If it's not a regular file, it e.g. enables use of poll() to avoid blocking forever. But this was done only for FDs that were open()ed by us, not from stdin special handling or fd://. Consequently, " | mpv -" could block the player. Fix this by moving the code and running for it on all FDs. Also, set p->regular_file even on mingw.
-rw-r--r--stream/stream_file.c33
1 files changed, 16 insertions, 17 deletions
diff --git a/stream/stream_file.c b/stream/stream_file.c
index 8778e7e011..2d0e3457c0 100644
--- a/stream/stream_file.c
+++ b/stream/stream_file.c
@@ -309,7 +309,6 @@ static int open_f(stream_t *stream)
openmode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
if (!write)
m |= O_NONBLOCK;
- p->use_poll = true;
#endif
p->fd = open(filename, m | O_BINARY, openmode);
if (p->fd < 0) {
@@ -317,25 +316,25 @@ static int open_f(stream_t *stream)
filename, mp_strerror(errno));
return STREAM_ERROR;
}
- struct stat st;
- if (fstat(p->fd, &st) == 0) {
- if (S_ISDIR(st.st_mode)) {
- p->use_poll = false;
- stream->is_directory = true;
- stream->allow_caching = false;
- MP_INFO(stream, "This is a directory - adding to playlist.\n");
- }
+ p->close = true;
+ }
+
+ struct stat st;
+ if (fstat(p->fd, &st) == 0) {
+ if (S_ISDIR(st.st_mode)) {
+ stream->is_directory = true;
+ stream->allow_caching = false;
+ MP_INFO(stream, "This is a directory - adding to playlist.\n");
+ } else if (S_ISREG(st.st_mode)) {
+ p->regular_file = true;
#ifndef __MINGW32__
- if (S_ISREG(st.st_mode)) {
- p->use_poll = false;
- p->regular_file = true;
- // O_NONBLOCK has weird semantics on file locks; remove it.
- int val = fcntl(p->fd, F_GETFL) & ~(unsigned)O_NONBLOCK;
- fcntl(p->fd, F_SETFL, val);
- }
+ // O_NONBLOCK has weird semantics on file locks; remove it.
+ int val = fcntl(p->fd, F_GETFL) & ~(unsigned)O_NONBLOCK;
+ fcntl(p->fd, F_SETFL, val);
#endif
+ } else {
+ p->use_poll = true;
}
- p->close = true;
}
#ifdef __MINGW32__