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

Reply via email to