Mercurial > hg > octave-nkf > gnulib-hg
changeset 9153:f03082407073
Work around lseek bug on BeOS.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Sun, 19 Aug 2007 09:08:05 +0000 |
parents | 5c635afb24c8 |
children | 0a3b6ec42c55 |
files | ChangeLog doc/functions/lseek.texi lib/lseek.c m4/lseek.m4 |
diffstat | 4 files changed, 32 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-08-18 Bruno Haible <bruno@clisp.org> + Eric Blake <ebb9@byu.net> + + * lib/lseek.c: Include <sys/stat.h>. + (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 <bruno@clisp.org> * modules/fstrcmp-tests: New file.
--- a/doc/functions/lseek.texi +++ b/doc/functions/lseek.texi @@ -9,7 +9,7 @@ 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:
--- a/lib/lseek.c +++ b/lib/lseek.c @@ -20,9 +20,13 @@ /* Specification. */ #include <unistd.h> -/* Get GetFileType. The replacement lseek is only used on mingw, so - this include can be unconditional. */ -#include <windows.h> +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Windows platforms. */ +/* Get GetFileType. */ +# include <windows.h> +#else +# include <sys/stat.h> +#endif #include <errno.h> #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 @@ 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); }
--- 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 @@ [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])