summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
authorStefano Pigozzi <stefano.pigozzi@gmail.com>2014-02-17 12:51:38 +0100
committerStefano Pigozzi <stefano.pigozzi@gmail.com>2014-02-17 19:39:49 +0100
commit689646962ea4bfd83b37a898f5669be071d3e17d (patch)
tree1bfb1601a898c7d151835da2099c644fa6cf2f56 /stream
parent5fcf4b46f7e1eea43a2e675a6be3fa99c2dd4dd6 (diff)
downloadmpv-689646962ea4bfd83b37a898f5669be071d3e17d.tar.bz2
mpv-689646962ea4bfd83b37a898f5669be071d3e17d.tar.xz
stream_file: activate cache with files on network file systems
Detected 'protocols' are AFP, nfs, smb and webdav. This can be extended on request. This is currently only implemented for BSD systems (using fstatfs). This addresses issue #558 on the above platforms.
Diffstat (limited to 'stream')
-rw-r--r--stream/stream_file.c28
1 files changed, 28 insertions, 0 deletions
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 <sys/param.h>
+#include <sys/mount.h>
+#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;
}