diff --git a/stream/stream_file.c b/stream/stream_file.c index 3591227f75..570546db19 100644 --- a/stream/stream_file.c +++ b/stream/stream_file.c @@ -34,6 +34,11 @@ #include "options/m_option.h" #include "options/path.h" +#if HAVE_BSD_FSTATFS +#include +#include +#endif + struct priv { int fd; bool close; @@ -108,6 +113,26 @@ char *mp_file_url_to_filename(void *talloc_ctx, bstr url) return filename; } +#if HAVE_BSD_FSTATFS +static bool check_stream_network(stream_t *stream) +{ + struct statfs fs; + const char *stypes[] = { "afpfs", "nfs", "smbfs", "webdav", NULL }; + struct priv *priv = stream->priv; + if (fstatfs(priv->fd, &fs) == 0) + for (int i=0; stypes[i]; i++) + if (strcmp(stypes[i], fs.f_fstypename) == 0) + return true; + return false; + +} +#else +static bool check_stream_network(stream_t *stream) +{ + return false; +} +#endif + static int open_f(stream_t *stream, int mode) { int fd; @@ -195,6 +220,9 @@ static int open_f(stream_t *stream, int mode) stream->read_chunk = 64 * 1024; stream->close = s_close; + if (check_stream_network(stream)) + stream->streaming = true; + return STREAM_OK; } diff --git a/wscript b/wscript index de70718555..2292a44747 100644 --- a/wscript +++ b/wscript @@ -196,6 +196,11 @@ iconv support use --disable-iconv.", 'name': 'setmode', 'desc': 'setmode()', 'func': check_statement('io.h', 'setmode(0, 0)') + }, { + 'name': 'bsd-fstatfs', + 'desc': "BSD's fstatfs()", + 'func': check_statement(['sys/param.h', 'sys/mount.h'], + 'struct statfs fs; fstatfs(0, &fs)') }, { 'name': 'sys-sysinfo-h', 'desc': 'sys/sysinfo.h',