mirror of
https://github.com/mpv-player/mpv
synced 2024-12-28 18:12:22 +00:00
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.
This commit is contained in:
parent
c9fcd20959
commit
34259f11dc
@ -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,27 +316,27 @@ 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");
|
||||
}
|
||||
#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);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
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__
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __MINGW32__
|
||||
setmode(p->fd, O_BINARY);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user