Hi, This patch addresses the following issue: [Problem] MinGW build of flac command fails to parse piped WAV input with WAVEFORMATEXTENSIBLE format.
[Description] This is because MinGW fseeko() doesn't return error for the attempt to seek on non seekable file (same behavior as MSVC). The simplest solution would be to change #ifdef _MSC_VER to #ifdef _WIN32 here. Instead, this patch tests file with fstat(), and use fseeko() only when it is a regular file. This is confirmed to work properly both on MSVC and MinGW, can seek if stdin is a redirected regular file, and doesn't require #ifdef.
diff --git a/src/flac/encode.c b/src/flac/encode.c index 42fef00..f4b7a4c 100644 --- a/src/flac/encode.c +++ b/src/flac/encode.c @@ -26,6 +26,7 @@ #include <stdio.h> /* for FILE etc. */ #include <stdlib.h> /* for malloc */ #include <string.h> /* for strcmp(), strerror() */ +#include <sys/stat.h> #include "FLAC/all.h" #include "share/alloc.h" #include "share/grabbag.h" @@ -2799,29 +2800,18 @@ FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, const char *fn) FLAC__bool fskip_ahead(FILE *f, FLAC__uint64 offset) { static unsigned char dump[8192]; + struct stat stb; -#ifdef _MSC_VER - if(f == stdin) { - /* MS' stdio impl can't even seek forward on stdin, have to use pure non-fseek() version: */ - while(offset > 0) { - const long need = (long)min(offset, sizeof(dump)); - if((long)fread(dump, 1, need, f) < need) - return false; - offset -= need; - } - } - else -#endif + if(fstat(fileno(f), &stb) == 0 && (stb.st_mode & S_IFMT) == S_IFREG) { - while(offset > 0) { - long need = (long)min(offset, LONG_MAX); - if(fseeko(f, need, SEEK_CUR) < 0) { - need = (long)min(offset, sizeof(dump)); - if((long)fread(dump, 1, need, f) < need) - return false; - } - offset -= need; - } + if(fseeko(f, offset, SEEK_CUR) == 0) + return true; + } + while(offset > 0) { + const long need = (long)min(offset, sizeof(dump)); + if((long)fread(dump, 1, need, f) < need) + return false; + offset -= need; } return true; }
_______________________________________________ flac-dev mailing list flac-dev@xiph.org http://lists.xiph.org/mailman/listinfo/flac-dev