win32: make lseek() fail on pipes

On MingGW seeking on pipes succeeds.

This fix is quite similar to Gnulib's (lib/lseek.c).
This commit is contained in:
wm4 2014-10-17 21:37:38 +02:00
parent 0abe9b0e0a
commit a7eb363ac1
2 changed files with 19 additions and 0 deletions

View File

@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License along
* with mplayer2. If not, see <http://www.gnu.org/licenses/>. * with mplayer2. If not, see <http://www.gnu.org/licenses/>.
*/ */
#define MP_HIDE_IO_REPLACEMENTS
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
@ -395,4 +396,14 @@ char *mp_getenv(const char *name)
return NULL; 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__ #endif // __MINGW32__

View File

@ -77,6 +77,7 @@ int mp_closedir(DIR *dir);
int mp_mkdir(const char *path, int mode); int mp_mkdir(const char *path, int mode);
FILE *mp_tmpfile(void); FILE *mp_tmpfile(void);
char *mp_getenv(const char *name); char *mp_getenv(const char *name);
off_t mp_lseek(int fd, off_t offset, int whence);
typedef struct { typedef struct {
size_t gl_pathc; size_t gl_pathc;
@ -105,6 +106,13 @@ void mp_globfree(mp_glob_t *pglob);
#define tmpfile(...) mp_tmpfile(__VA_ARGS__) #define tmpfile(...) mp_tmpfile(__VA_ARGS__)
#define getenv(...) mp_getenv(__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 #ifndef GLOB_NOMATCH
#define GLOB_NOMATCH 3 #define GLOB_NOMATCH 3
#endif #endif