X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess_filter%2Fdump.c;h=22d2e8a60270f990ae26a35ce9f0dc043768bb6b;hb=c24786dc06f15eef79cb29fd6344711d62eaa6f6;hp=884080006b8e9b942abe4c7df5d0715f63c8f605;hpb=919c654290c6a721259e25fd570fe78d57113235;p=vlc diff --git a/modules/access_filter/dump.c b/modules/access_filter/dump.c index 884080006b..22d2e8a602 100644 --- a/modules/access_filter/dump.c +++ b/modules/access_filter/dump.c @@ -23,15 +23,13 @@ #include -#include -#include #include #include #include -#include "vlc_access.h" -#include "vlc_block.h" -#include "charset.h" +#include + +#include #include "vlc_keys.h" #define DEFAULT_MARGIN 32 // megabytes @@ -75,6 +73,7 @@ struct access_sys_t { FILE *stream; int64_t tmp_max; + int64_t dumpsize; }; /** @@ -112,7 +111,7 @@ static int Open (vlc_object_t *obj) if ((p_sys->stream = tmpfile ()) == NULL) { - msg_Err (access, "cannot create temporary file: %s", strerror (errno)); + msg_Err (access, "cannot create temporary file: %m"); free (p_sys); return VLC_EGENERIC; } @@ -145,21 +144,34 @@ static void Dump (access_t *access, const uint8_t *buffer, size_t len) access_sys_t *p_sys = access->p_sys; FILE *stream = p_sys->stream; - if ((stream == NULL) || (len == 0)) + if ((stream == NULL) /* not dumping */ + || (access->info.i_pos < p_sys->dumpsize) /* already known data */) return; + size_t needed = access->info.i_pos - p_sys->dumpsize; + if (len < needed) + return; /* gap between data and dump offset (seek too far ahead?) */ + + buffer += len - needed; + len = needed; + + if (len == 0) + return; /* no useful data */ + if ((p_sys->tmp_max != -1) && (access->info.i_pos > p_sys->tmp_max)) { msg_Dbg (access, "too much data - dump will not work"); goto error; } + assert (len > 0); if (fwrite (buffer, len, 1, stream) != 1) { - msg_Err (access, "cannot write to file: %s", strerror (errno)); + msg_Err (access, "cannot write to file: %m"); goto error; } + p_sys->dumpsize += len; return; error: @@ -177,7 +189,6 @@ static int Read (access_t *access, uint8_t *buffer, int len) access->info = src->info; Dump (access, buffer, len); - //Trigger (access); return len; } @@ -221,11 +232,7 @@ static int Seek (access_t *access, int64_t offset) } if (p_sys->stream != NULL) - { - msg_Dbg (access, "seeking - dump will not work"); - fclose (p_sys->stream); - p_sys->stream = NULL; - } + msg_Dbg (access, "seeking - dump might not work"); src->info.i_update = access->info.i_update; int ret = src->pf_seek (src, offset); @@ -242,7 +249,7 @@ static inline struct tm *localtime_r (const time_t *now, struct tm *res) * This is not thread-safe. Blame your C library. * On Win32 there SHOULD be _localtime_s instead, but of course * Cygwin and Mingw32 don't know about it. You're on your own if you - * this platform. + * use this platform. */ if (unsafe == NULL) return NULL; @@ -284,11 +291,10 @@ static void Trigger (access_t *access) msg_Info (access, "dumping media to \"%s\"...", filename); - FILE *newstream = fopen (filename, "wb"); + FILE *newstream = utf8_fopen (filename, "wb"); if (newstream == NULL) { - msg_Err (access, "cannot create dump file \"%s\": %s", filename, - strerror (errno)); + msg_Err (access, "cannot create dump file \"%s\": %m", filename); return; } @@ -304,8 +310,7 @@ static void Trigger (access_t *access) { if (ferror (oldstream)) { - msg_Err (access, "cannot read temporary file: %s", - strerror (errno)); + msg_Err (access, "cannot read temporary file: %m"); break; } @@ -318,7 +323,7 @@ static void Trigger (access_t *access) if (fwrite (buf, len, 1, newstream) != 1) { - msg_Err (access, "cannot write dump file: %s", strerror (errno)); + msg_Err (access, "cannot write dump file: %m"); break; } }