From d2d412207bf7ceffe7ad8bdd29c8355ae3781258 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 19 Aug 2007 09:08:05 +0000 Subject: [PATCH] Work around lseek bug on BeOS. --- ChangeLog | 9 +++++++++ doc/functions/lseek.texi | 2 +- lib/lseek.c | 22 +++++++++++++++++++--- m4/lseek.m4 | 6 +++--- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4d7c0dc1ff..d863bebb6b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-08-18 Bruno Haible + Eric Blake + + * lib/lseek.c: Include . + (rpl_lseek): Add workaround code also for Unix platforms. + Needed for BeOS. + * m4/lseek.m4 (gl_FUNC_LSEEK): When cross-compiling, fail on BeOS. + * doc/functions/lseek.texi: Document BeOS definiency. + 2007-08-18 Bruno Haible * modules/fstrcmp-tests: New file. diff --git a/doc/functions/lseek.texi b/doc/functions/lseek.texi index e39ad01a76..1f214d18c4 100644 --- a/doc/functions/lseek.texi +++ b/doc/functions/lseek.texi @@ -9,7 +9,7 @@ Gnulib module: lseek Portability problems fixed by Gnulib: @itemize @item -This function mistakenly succeeds on pipes on some platforms: mingw. +This function mistakenly succeeds on pipes on some platforms: mingw, BeOS. @end itemize Portability problems not fixed by Gnulib: diff --git a/lib/lseek.c b/lib/lseek.c index 03830a9acd..db8dbfb3e9 100644 --- a/lib/lseek.c +++ b/lib/lseek.c @@ -20,9 +20,13 @@ /* Specification. */ #include -/* Get GetFileType. The replacement lseek is only used on mingw, so - this include can be unconditional. */ -#include +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Windows platforms. */ +/* Get GetFileType. */ +# include +#else +# include +#endif #include #undef lseek @@ -30,6 +34,7 @@ off_t rpl_lseek (int fd, off_t offset, int whence) { +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* mingw lseek mistakenly succeeds on pipes, sockets, and terminals. */ HANDLE h = (HANDLE) _get_osfhandle (fd); if (h == INVALID_HANDLE_VALUE) @@ -42,5 +47,16 @@ rpl_lseek (int fd, off_t offset, int whence) errno = ESPIPE; return -1; } +#else + /* BeOS lseek mistakenly succeeds on pipes... */ + struct stat statbuf; + if (fstat (fd, &statbuf) < 0) + return -1; + if (!S_ISREG (statbuf.st_mode)) + { + errno = ESPIPE; + return -1; + } +#endif return lseek (fd, offset, whence); } diff --git a/m4/lseek.m4 b/m4/lseek.m4 index 69e9ea755c..f336990709 100644 --- a/m4/lseek.m4 +++ b/m4/lseek.m4 @@ -1,4 +1,4 @@ -# lseek.m4 serial 3 +# lseek.m4 serial 4 dnl Copyright (C) 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -29,8 +29,8 @@ int main () [gl_cv_func_lseek_pipe=no]) else AC_COMPILE_IFELSE([ -#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ -/* mingw mistakenly returns 0 when trying to seek on pipes. */ +#if ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) || defined __BEOS__ +/* mingw and BeOS mistakenly return 0 when trying to seek on pipes. */ Choke me. #endif], [gl_cv_func_lseek_pipe=yes], [gl_cv_func_lseek_pipe=no]) -- 2.30.2