From a7eb363ac1acb5566ce1af923d07c658361d5ad4 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 17 Oct 2014 21:37:38 +0200 Subject: [PATCH] win32: make lseek() fail on pipes On MingGW seeking on pipes succeeds. This fix is quite similar to Gnulib's (lib/lseek.c). --- osdep/io.c | 11 +++++++++++ osdep/io.h | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/osdep/io.c b/osdep/io.c index 819cdcbf69..b93618400c 100644 --- a/osdep/io.c +++ b/osdep/io.c @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License along * with mplayer2. If not, see . */ +#define MP_HIDE_IO_REPLACEMENTS #include #include @@ -395,4 +396,14 @@ char *mp_getenv(const char *name) return NULL; } +off_t mp_lseek(int fd, off_t offset, int whence) +{ + HANDLE h = (HANDLE)_get_osfhandle(fd); + if (h != INVALID_HANDLE_VALUE && GetFileType(h) != FILE_TYPE_DISK) { + errno = ESPIPE; + return (off_t)-1; + } + return lseek(fd, offset, whence); +} + #endif // __MINGW32__ diff --git a/osdep/io.h b/osdep/io.h index ae3cdc1802..a24ad7c231 100644 --- a/osdep/io.h +++ b/osdep/io.h @@ -77,6 +77,7 @@ int mp_closedir(DIR *dir); int mp_mkdir(const char *path, int mode); FILE *mp_tmpfile(void); char *mp_getenv(const char *name); +off_t mp_lseek(int fd, off_t offset, int whence); typedef struct { size_t gl_pathc; @@ -105,6 +106,13 @@ void mp_globfree(mp_glob_t *pglob); #define tmpfile(...) mp_tmpfile(__VA_ARGS__) #define getenv(...) mp_getenv(__VA_ARGS__) +// Things MinGW defines as macros, and which we want to override only for the +// user, and not io.c (which wants the original definition). +#ifndef MP_HIDE_IO_REPLACEMENTS +#undef lseek +#define lseek(...) mp_lseek(__VA_ARGS__) +#endif + #ifndef GLOB_NOMATCH #define GLOB_NOMATCH 3 #endif