diff options
Diffstat (limited to 'stream/stream_file.c')
-rw-r--r-- | stream/stream_file.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/stream/stream_file.c b/stream/stream_file.c index d649ff4bdf..89e7a2d9f1 100644 --- a/stream/stream_file.c +++ b/stream/stream_file.c @@ -50,6 +50,7 @@ #ifdef _WIN32 #include <windows.h> +#include <winioctl.h> #include <winternl.h> #include <io.h> @@ -176,7 +177,7 @@ static bool check_stream_network(int fd) { struct statfs fs; const char *stypes[] = { "afpfs", "nfs", "smbfs", "webdav", "osxfusefs", - "fuse", "fusefs.sshfs", NULL }; + "fuse", "fusefs.sshfs", "macfuse", NULL }; if (fstatfs(fd, &fs) == 0) for (int i=0; stypes[i]; i++) if (strcmp(stypes[i], fs.f_fstypename) == 0) @@ -246,7 +247,7 @@ static bool check_stream_network(int fd) } #endif -static int open_f(stream_t *stream, struct stream_open_args *args) +static int open_f(stream_t *stream, const struct stream_open_args *args) { struct priv *p = talloc_ptrtype(stream, p); *p = (struct priv) { @@ -306,6 +307,7 @@ static int open_f(stream_t *stream, struct stream_open_args *args) } struct stat st; + bool is_sock_or_fifo = false; if (fstat(p->fd, &st) == 0) { if (S_ISDIR(st.st_mode)) { stream->is_directory = true; @@ -319,6 +321,9 @@ static int open_f(stream_t *stream, struct stream_open_args *args) fcntl(p->fd, F_SETFL, val); #endif } else { +#ifndef __MINGW32__ + is_sock_or_fifo = S_ISSOCK(st.st_mode) || S_ISFIFO(st.st_mode); +#endif p->use_poll = true; } } @@ -340,8 +345,15 @@ static int open_f(stream_t *stream, struct stream_open_args *args) stream->get_size = get_size; stream->close = s_close; - if (check_stream_network(p->fd)) + if (is_sock_or_fifo || check_stream_network(p->fd)) { stream->streaming = true; +#if HAVE_COCOA + if (fcntl(p->fd, F_RDAHEAD, 0) < 0) { + MP_VERBOSE(stream, "Cannot disable read ahead on file '%s': %s\n", + filename, mp_strerror(errno)); + } +#endif + } p->orig_size = get_size(stream); |