1
0
mirror of https://git.savannah.gnu.org/git/gnulib.git synced 2025-08-17 12:41:05 +03:00

Fix lseek on mingw.

* modules/lseek: New module.
* m4/lseek.m4: New file.
* lib/lseek.c: New file.
* modules/lseek-tests: New file.
* tests/test-lseek.c: New file.
* tests/test-lseek.sh: New file.
* MODULES.html.sh: Document lseek module.
* modules/fflush (Depends-on): Add lseek, fseeko.
* modules/fseeko (Depends-on): Likewise.
* modules/ftello (Depends-on): Likewise.
* m4/fseeko.m4 (gl_FUNC_FSEEKO): Replace fseek[o] if lseek is
broken.
* m4/ftello.m4 (gl_FUNC_FTELLO): Replace ftell[o] if lseek is
broken.
* m4/fflush.m4 (gl_REPLACE_FFLUSH): Trigger fseeko module.
* lib/fseeko.c (rpl_fseeko): Quit early on non-seekable files.
* lib/ftello.c (rpl_ftello): Likewise.
* tests/test-fseeko.c (main): Test this.
* tests/test-fseeko.sh: Likewise.
* tests/test-ftello.c (main): Likewise.
* tests/test-ftello.sh: Likewise.
* lib/stdio_.h (fseek, ftell): Simplify, since missing fseeko now
implies replacing fseek.
* modules/stdio (Makefile.am): No longer need HAVE_FSEEKO,
HAVE_FTELLO.
* m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add lseek info.
* modules/unistd (Makefile.am): Likewise.
* lib/unistd_.h (lseek): Declare a replacement.
* doc/functions/lseek.texi (lseek): Document this fix.
* doc/functions/fseek.texi (fseek): Likewise.
* doc/functions/ftell.texi (ftell): Likewise.
This commit is contained in:
Eric Blake
2007-05-24 16:59:20 +00:00
parent e55d665f28
commit e461ff7387
28 changed files with 280 additions and 43 deletions

View File

@@ -1,3 +1,38 @@
2007-05-24 Eric Blake <ebb9@byu.net>
Fix lseek on mingw.
* modules/lseek: New module.
* m4/lseek.m4: New file.
* lib/lseek.c: New file.
* modules/lseek-tests: New file.
* tests/test-lseek.c: New file.
* tests/test-lseek.sh: New file.
* MODULES.html.sh: Document lseek module.
* modules/fflush (Depends-on): Add lseek, fseeko.
* modules/fseeko (Depends-on): Likewise.
* modules/ftello (Depends-on): Likewise.
* m4/fseeko.m4 (gl_FUNC_FSEEKO): Replace fseek[o] if lseek is
broken.
* m4/ftello.m4 (gl_FUNC_FTELLO): Replace ftell[o] if lseek is
broken.
* m4/fflush.m4 (gl_REPLACE_FFLUSH): Trigger fseeko module.
* lib/fseeko.c (rpl_fseeko): Quit early on non-seekable files.
* lib/ftello.c (rpl_ftello): Likewise.
* tests/test-fseeko.c (main): Test this.
* tests/test-fseeko.sh: Likewise.
* tests/test-ftello.c (main): Likewise.
* tests/test-ftello.sh: Likewise.
* lib/stdio_.h (fseek, ftell): Simplify, since missing fseeko now
implies replacing fseek.
* modules/stdio (Makefile.am): No longer need HAVE_FSEEKO,
HAVE_FTELLO.
* m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add lseek info.
* modules/unistd (Makefile.am): Likewise.
* lib/unistd_.h (lseek): Declare a replacement.
* doc/functions/lseek.texi (lseek): Document this fix.
* doc/functions/fseek.texi (fseek): Likewise.
* doc/functions/ftell.texi (ftell): Likewise.
2007-05-24 Bruno Haible <bruno@clisp.org> 2007-05-24 Bruno Haible <bruno@clisp.org>
* tests/test-vasnprintf-posix.c (test_function): Allow up to 50 bytes * tests/test-vasnprintf-posix.c (test_function): Allow up to 50 bytes

View File

@@ -2029,13 +2029,14 @@ func_all_modules ()
func_module gettimeofday func_module gettimeofday
func_module inet_ntop func_module inet_ntop
func_module inet_pton func_module inet_pton
func_module lseek
func_module lstat
func_module mkdir func_module mkdir
func_module mkdtemp func_module mkdtemp
func_module mkstemp func_module mkstemp
func_module poll func_module poll
func_module readlink
func_module lstat
func_module printf-posix func_module printf-posix
func_module readlink
func_module snprintf-posix func_module snprintf-posix
func_module sprintf-posix func_module sprintf-posix
func_module string func_module string

View File

@@ -4,10 +4,12 @@
POSIX specification: @url{http://www.opengroup.org/susv3xsh/fseek.html} POSIX specification: @url{http://www.opengroup.org/susv3xsh/fseek.html}
Gnulib module: --- Gnulib module: fseeko
Portability problems fixed by Gnulib: Portability problems fixed by Gnulib:
@itemize @itemize
@item
This function mistakenly succeeds on non-seekable files: mingw.
@end itemize @end itemize
Portability problems not fixed by Gnulib: Portability problems not fixed by Gnulib:
@@ -15,4 +17,7 @@ Portability problems not fixed by Gnulib:
@item @item
On Windows platforms (excluding Cygwin), this function does not set @code{errno} On Windows platforms (excluding Cygwin), this function does not set @code{errno}
upon failure. upon failure.
@item
On platforms where @code{off_t} is a 32-bit type, @code{fseek} does not work
correctly with files larger than 2 GB. The fix is to use fseeko instead.
@end itemize @end itemize

View File

@@ -4,10 +4,12 @@
POSIX specification: @url{http://www.opengroup.org/susv3xsh/ftell.html} POSIX specification: @url{http://www.opengroup.org/susv3xsh/ftell.html}
Gnulib module: --- Gnulib module: ftello
Portability problems fixed by Gnulib: Portability problems fixed by Gnulib:
@itemize @itemize
@item
This function mistakenly succeeds on non-seekable files: mingw.
@end itemize @end itemize
Portability problems not fixed by Gnulib: Portability problems not fixed by Gnulib:
@@ -16,4 +18,7 @@ Portability problems not fixed by Gnulib:
@code{fflush}, @code{ftell}, @code{ftello}, @code{fgetpos} behave incorrectly @code{fflush}, @code{ftell}, @code{ftello}, @code{fgetpos} behave incorrectly
on input streams that are opened in @code{O_TEXT} mode and whose contents on input streams that are opened in @code{O_TEXT} mode and whose contents
contains Unix line terminators (LF), on some platforms: mingw. contains Unix line terminators (LF), on some platforms: mingw.
@item
On platforms where @code{off_t} is a 32-bit type, @code{ftell} does not work
correctly with files larger than 2 GB. The fix is to use ftello instead.
@end itemize @end itemize

View File

@@ -4,10 +4,12 @@
POSIX specification: @url{http://www.opengroup.org/susv3xsh/lseek.html} POSIX specification: @url{http://www.opengroup.org/susv3xsh/lseek.html}
Gnulib module: --- Gnulib module: lseek
Portability problems fixed by Gnulib: Portability problems fixed by Gnulib:
@itemize @itemize
@item
This function mistakenly succeeds on non-seekable files: mingw.
@end itemize @end itemize
Portability problems not fixed by Gnulib: Portability problems not fixed by Gnulib:

View File

@@ -25,12 +25,19 @@
#undef fseeko #undef fseeko
#if !HAVE_FSEEKO #if !HAVE_FSEEKO
# undef fseek
# define fseeko fseek # define fseeko fseek
#endif #endif
int int
rpl_fseeko (FILE *fp, off_t offset, int whence) rpl_fseeko (FILE *fp, off_t offset, int whence)
{ {
#if LSEEK_PIPE_BROKEN
/* mingw gives bogus answers rather than failure on non-seekable files. */
if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
return EOF;
#endif
/* These tests are based on fpurge.c. */ /* These tests are based on fpurge.c. */
#if defined _IO_ferror_unlocked /* GNU libc, BeOS */ #if defined _IO_ferror_unlocked /* GNU libc, BeOS */
if (fp->_IO_read_end == fp->_IO_read_ptr if (fp->_IO_read_end == fp->_IO_read_ptr

View File

@@ -20,14 +20,24 @@
/* Specification. */ /* Specification. */
#include <stdio.h> #include <stdio.h>
/* Get lseek. */
#include <unistd.h>
#undef ftello #undef ftello
#if !HAVE_FTELLO #if !HAVE_FTELLO
# undef ftell
# define ftello ftell # define ftello ftell
#endif #endif
off_t off_t
rpl_ftello (FILE *fp) rpl_ftello (FILE *fp)
{ {
#if LSEEK_PIPE_BROKEN
/* mingw gives bogus answers rather than failure on non-seekable files. */
if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
return -1;
#endif
#if defined __SL64 && defined __SCLE /* Cygwin */ #if defined __SL64 && defined __SCLE /* Cygwin */
if ((fp->_flags & __SL64) == 0) if ((fp->_flags & __SL64) == 0)
{ {

40
lib/lseek.c Normal file
View File

@@ -0,0 +1,40 @@
/* An lseek() function that detects pipes.
Copyright (C) 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#include <config.h>
/* Specification. */
#include <unistd.h>
/* Get GetFileType. The replacement lseek is only used on mingw, so
this include can be unconditional. */
#include <windows.h>
#include <errno.h>
#undef lseek
off_t
rpl_lseek (int fd, off_t offset, int whence)
{
/* mingw lseek mistakenly succeeds on pipes, sockets, and terminals. */
if (GetFileType ((HANDLE) _get_osfhandle (fd)) != FILE_TYPE_DISK)
{
errno = ESPIPE;
return -1;
}
return lseek (fd, offset, whence);
}

View File

@@ -42,9 +42,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <stddef.h> #include <stddef.h>
#if (@GNULIB_FFLUSH@ && @REPLACE_FFLUSH@) \ #if (@GNULIB_FSEEKO@ && @REPLACE_FSEEKO@) || (@GNULIB_FTELLO@ && @REPLACE_FTELLO@)
|| (@GNULIB_FSEEKO@ && (!@HAVE_FSEEKO@ || @REPLACE_FSEEKO@)) \
|| (@GNULIB_FTELLO@ && (!@HAVE_FTELLO@ || @REPLACE_FTELLO@))
/* Get off_t. */ /* Get off_t. */
# include <sys/types.h> # include <sys/types.h>
#endif #endif
@@ -218,16 +216,13 @@ extern int vsprintf (char *str, const char *format, va_list args)
# endif # endif
#endif #endif
#if (@GNULIB_FFLUSH@ && @REPLACE_FFLUSH@) || (@GNULIB_FSEEKO@ && @REPLACE_FSEEKO@) #if @GNULIB_FSEEKO@
/* Provide fseek, fseeko functions that are aware of a preceding fflush(). */ # if @REPLACE_FSEEKO@
# define fseeko rpl_fseeko /* Provide fseek, fseeko functions that are aware of a preceding
fflush(), and which detect pipes. */
# define fseeko rpl_fseeko
extern int fseeko (FILE *fp, off_t offset, int whence); extern int fseeko (FILE *fp, off_t offset, int whence);
# define fseek(fp, offset, whence) fseeko (fp, (off_t)(offset), whence) # define fseek(fp, offset, whence) fseeko (fp, (off_t)(offset), whence)
#elif @GNULIB_FSEEKO@
# if !@HAVE_FSEEKO@
/* Assume 'off_t' is the same type as 'long'. */
typedef int verify_fseeko_types[2 * (sizeof (off_t) == sizeof (long)) - 1];
# define fseeko fseek
# endif # endif
#elif defined GNULIB_POSIXCHECK #elif defined GNULIB_POSIXCHECK
# undef fseeko # undef fseeko
@@ -248,13 +243,10 @@ typedef int verify_fseeko_types[2 * (sizeof (off_t) == sizeof (long)) - 1];
#endif #endif
#if @GNULIB_FTELLO@ #if @GNULIB_FTELLO@
# if !@HAVE_FTELLO@ # if @REPLACE_FTELLO@
/* Assume 'off_t' is the same type as 'long'. */
typedef int verify_ftello_types[2 * (sizeof (off_t) == sizeof (long)) - 1];
# define ftello ftell
# elif @REPLACE_FTELLO@
# define ftello rpl_ftello # define ftello rpl_ftello
extern off_t ftello (FILE *fp); extern off_t ftello (FILE *fp);
# define ftell(fp) ftello (fp)
# endif # endif
#elif defined GNULIB_POSIXCHECK #elif defined GNULIB_POSIXCHECK
# undef ftello # undef ftello

View File

@@ -176,6 +176,25 @@ extern int getlogin_r (char *name, size_t size);
#endif #endif
#if @GNULIB_LSEEK@
# if @REPLACE_LSEEK@
/* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END.
Return the new offset if successful, otherwise -1 and errno set.
See the POSIX:2001 specification
<http://www.opengroup.org/susv3xsh/lseek.html>. */
# define lseek rpl_lseek
extern off_t lseek (int fd, off_t offset, int whence);
# endif
#elif defined GNULIB_POSIXCHECK
# undef lseek
# define lseek(f,o,w) \
(GL_LINK_WARNING ("lseek does not fail with ESPIPE on non-seekable " \
"files on some systems - " \
"use gnulib module lseek for portability"), \
lseek (f, o, w))
#endif
#if @GNULIB_READLINK@ #if @GNULIB_READLINK@
/* Read the contents of the symbolic link FILE and place the first BUFSIZE /* Read the contents of the symbolic link FILE and place the first BUFSIZE
bytes of it into BUF. Return the number of bytes placed into BUF if bytes of it into BUF. Return the number of bytes placed into BUF if

View File

@@ -1,4 +1,4 @@
#serial 3 # fflush.m4 serial 4
# Copyright (C) 2007 Free Software Foundation, Inc. # Copyright (C) 2007 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
@@ -20,9 +20,9 @@ AC_DEFUN([gl_FUNC_FFLUSH],
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
]], [[FILE *f = fopen ("conftest.txt", "r"); ]], [[FILE *f = fopen ("conftest.txt", "r");
char buffer[10]; char buffer[10];
int fd = fileno (f); int fd = fileno (f);
if (!f || 0 > fd || fread (buffer, 1, 5, f) != 5) if (!f || 0 > fd || fread (buffer, 1, 5, f) != 5)
return 2; return 2;
/* For deterministic results, ensure f read a bigger buffer. */ /* For deterministic results, ensure f read a bigger buffer. */
if (lseek (fd, 0, SEEK_CUR) == 5) if (lseek (fd, 0, SEEK_CUR) == 5)
@@ -48,4 +48,5 @@ AC_DEFUN([gl_REPLACE_FFLUSH],
AC_LIBOBJ([fseeko]) AC_LIBOBJ([fseeko])
AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([gl_STDIO_H_DEFAULTS])
REPLACE_FFLUSH=1 REPLACE_FFLUSH=1
REPLACE_FSEEKO=1
]) ])

View File

@@ -1,4 +1,4 @@
# fseeko.m4 serial 2 # fseeko.m4 serial 3
dnl Copyright (C) 2007 Free Software Foundation, Inc. dnl Copyright (C) 2007 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
@@ -12,10 +12,11 @@ AC_DEFUN([gl_FUNC_FSEEKO],
AC_CACHE_CHECK([for fseeko], [gl_cv_func_fseeko], AC_CACHE_CHECK([for fseeko], [gl_cv_func_fseeko],
[ [
AC_TRY_LINK([#include <stdio.h>], [fseeko (stdin, 0, 0);], AC_TRY_LINK([#include <stdio.h>], [fseeko (stdin, 0, 0);],
[gl_cv_func_fseeko=yes], [gl_cv_func_fseeko=no]) [gl_cv_func_fseeko=yes], [gl_cv_func_fseeko=no])
]) ])
if test $gl_cv_func_fseeko = no; then if test $gl_cv_func_fseeko = no; then
HAVE_FSEEKO=0 HAVE_FSEEKO=0
gl_REPLACE_FSEEKO
elif test $gl_cv_var_stdin_large_offset = no; then elif test $gl_cv_var_stdin_large_offset = no; then
gl_REPLACE_FSEEKO gl_REPLACE_FSEEKO
fi fi

View File

@@ -1,4 +1,4 @@
# ftello.m4 serial 2 # ftello.m4 serial 3
dnl Copyright (C) 2007 Free Software Foundation, Inc. dnl Copyright (C) 2007 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
@@ -12,10 +12,11 @@ AC_DEFUN([gl_FUNC_FTELLO],
AC_CACHE_CHECK([for ftello], [gl_cv_func_ftello], AC_CACHE_CHECK([for ftello], [gl_cv_func_ftello],
[ [
AC_TRY_LINK([#include <stdio.h>], [ftello (stdin);], AC_TRY_LINK([#include <stdio.h>], [ftello (stdin);],
[gl_cv_func_ftello=yes], [gl_cv_func_ftello=no]) [gl_cv_func_ftello=yes], [gl_cv_func_ftello=no])
]) ])
if test $gl_cv_func_ftello = no; then if test $gl_cv_func_ftello = no; then
HAVE_FTELLO=0 HAVE_FTELLO=0
gl_REPLACE_FTELLO
elif test $gl_cv_var_stdin_large_offset = no; then elif test $gl_cv_var_stdin_large_offset = no; then
gl_REPLACE_FTELLO gl_REPLACE_FTELLO
fi fi

30
m4/lseek.m4 Normal file
View File

@@ -0,0 +1,30 @@
# lseek.m4 serial 1
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,
dnl with or without modifications, as long as this notice is preserved.
AC_DEFUN([gl_FUNC_LSEEK],
[
AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
AC_REQUIRE([AC_PROG_CC])
AC_CACHE_CHECK([whether lseek detects pipes], [gl_cv_func_lseek_pipe],
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <unistd.h>],
[#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
/* mingw mistakenly returns 0 when trying to seek on pipes. */
Choke me.
#endif])],
[gl_cv_func_lseek_pipe=yes], [gl_cv_func_lseek_pipe=no])])
if test $gl_cv_func_lseek_pipe = no; then
gl_REPLACE_LSEEK
fi
])
AC_DEFUN([gl_REPLACE_LSEEK],
[
AC_LIBOBJ([lseek])
AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
REPLACE_LSEEK=1
AC_DEFINE([LSEEK_PIPE_BROKEN], [1],
[Define to 1 if lseek does not detect pipes.])
])

View File

@@ -1,4 +1,4 @@
# unistd_h.m4 serial 6 # unistd_h.m4 serial 7
dnl Copyright (C) 2006-2007 Free Software Foundation, Inc. dnl Copyright (C) 2006-2007 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
@@ -39,6 +39,7 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS],
GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE]) GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE])
GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD]) GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD])
GNULIB_GETLOGIN_R=0; AC_SUBST([GNULIB_GETLOGIN_R]) GNULIB_GETLOGIN_R=0; AC_SUBST([GNULIB_GETLOGIN_R])
GNULIB_LSEEK=0; AC_SUBST([GNULIB_LSEEK])
GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK]) GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK])
GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP]) GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP])
dnl Assume proper GNU behavior unless another module says otherwise. dnl Assume proper GNU behavior unless another module says otherwise.
@@ -50,4 +51,5 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS],
REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN]) REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN])
REPLACE_FCHDIR=0; AC_SUBST([REPLACE_FCHDIR]) REPLACE_FCHDIR=0; AC_SUBST([REPLACE_FCHDIR])
REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD]) REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD])
REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK])
]) ])

View File

@@ -3,16 +3,16 @@ Discard pending data on both input and output streams.
Files: Files:
lib/fflush.c lib/fflush.c
lib/fseeko.c
m4/fflush.m4 m4/fflush.m4
m4/fseeko.m4
Depends-on: Depends-on:
fpurge fpurge
ftello ftello
freading freading
lseek
stdio stdio
unistd unistd
fseeko
configure.ac-early: configure.ac-early:
AC_REQUIRE([AC_FUNC_FSEEKO]) AC_REQUIRE([AC_FUNC_FSEEKO])

View File

@@ -6,6 +6,7 @@ lib/fseeko.c
m4/fseeko.m4 m4/fseeko.m4
Depends-on: Depends-on:
lseek
stdio stdio
configure.ac-early: configure.ac-early:

View File

@@ -6,6 +6,7 @@ lib/ftello.c
m4/ftello.m4 m4/ftello.m4
Depends-on: Depends-on:
lseek
stdio stdio
configure.ac-early: configure.ac-early:

24
modules/lseek Normal file
View File

@@ -0,0 +1,24 @@
Description:
lseek() function: Reposition a file descriptor.
Files:
lib/lseek.c
m4/lseek.m4
Depends-on:
unistd
configure.ac:
gl_FUNC_LSEEK
gl_UNISTD_MODULE_INDICATOR([lseek])
Makefile.am:
Include:
<unistd.h>
License:
LGPL
Maintainer:
Eric Blake

13
modules/lseek-tests Normal file
View File

@@ -0,0 +1,13 @@
Files:
tests/test-lseek.c
tests/test-lseek.sh
Depends-on:
configure.ac:
Makefile.am:
TESTS += test-lseek.sh
TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@' srcdir='$(srcdir)'
check_PROGRAMS += test-lseek
EXTRA_DIST += test-lseek.sh

View File

@@ -46,9 +46,7 @@ stdio.h: stdio_.h
-e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \
-e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \
-e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \
-e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \
-e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \
-e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \
-e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \
-e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \
-e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \

View File

@@ -29,6 +29,7 @@ unistd.h: unistd_.h
-e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \ -e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \
-e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \ -e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \
-e 's|@''GNULIB_GETLOGIN_R''@|$(GNULIB_GETLOGIN_R)|g' \ -e 's|@''GNULIB_GETLOGIN_R''@|$(GNULIB_GETLOGIN_R)|g' \
-e 's|@''GNULIB_LSEEK''@|$(GNULIB_LSEEK)|g' \
-e 's|@''GNULIB_READLINK''@|$(GNULIB_READLINK)|g' \ -e 's|@''GNULIB_READLINK''@|$(GNULIB_READLINK)|g' \
-e 's|@''GNULIB_SLEEP''@|$(GNULIB_SLEEP)|g' \ -e 's|@''GNULIB_SLEEP''@|$(GNULIB_SLEEP)|g' \
-e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \ -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \
@@ -39,6 +40,7 @@ unistd.h: unistd_.h
-e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \ -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
-e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \ -e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \
-e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
-e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
< $(srcdir)/unistd_.h; \ < $(srcdir)/unistd_.h; \
} > $@-t } > $@-t
mv $@-t $@ mv $@-t $@

View File

@@ -25,8 +25,12 @@
#include <sys/types.h> #include <sys/types.h>
int int
main () main (int argc, char **argv)
{ {
/* This test assumes stdin is seekable. */ /* Assume stdin is seekable iff argc > 1. */
return fseeko (stdin, (off_t)0, SEEK_CUR) != 0; int expected = argc > 1 ? 0 : -1;
/* Exit with success only if fseek/fseeko agree. */
int r1 = fseeko (stdin, (off_t)0, SEEK_CUR);
int r2 = fseek (stdin, (long)0, SEEK_CUR);
return ! (r1 == r2 && r1 == expected);
} }

View File

@@ -1,3 +1,5 @@
#!/bin/sh #!/bin/sh
./test-fseeko${EXEEXT} < "$srcdir/test-fseeko.sh" ./test-fseeko${EXEEXT} 1 < "$srcdir/test-fseeko.sh" || exit 1
echo hi | ./test-fseeko${EXEEXT} || exit 1
exit 0

View File

@@ -25,9 +25,12 @@
#include <sys/types.h> #include <sys/types.h>
int int
main () main (int argc, char **argv)
{ {
/* This test assumes stdin is seekable. */ /* Assume stdin is seekable iff argc > 1. */
off_t pos = ftello (stdin); int expected = argc > 1 ? 0 : -1;
return pos < 0; /* Exit with success only if ftell/ftello agree. */
off_t pos1 = ftello (stdin);
long pos2 = ftell (stdin);
return ! (pos1 == pos2 && pos1 == expected);
} }

View File

@@ -1,3 +1,5 @@
#!/bin/sh #!/bin/sh
./test-ftello${EXEEXT} < "$srcdir/test-ftello.sh" ./test-ftello${EXEEXT} 1 < "$srcdir/test-ftello.sh" || exit 1
echo hi | ./test-ftello${EXEEXT} || exit 1
exit 0

29
tests/test-lseek.c Normal file
View File

@@ -0,0 +1,29 @@
/* Test of lseek() function.
Copyright (C) 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* Written by Eric Blake, 2007. */
#include <config.h>
#include <unistd.h>
int
main ()
{
/* Exit with success only if stdin is seekable. */
return lseek (0, (off_t)0, SEEK_CUR) < 0;
}

7
tests/test-lseek.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/sh
# Succeed on seekable stdin
./test-lseek${EXEEXT} < "$srcdir/test-lseek.sh" || exit 1
# Fail on pipe stdin
echo hi | ./test-lseek${EXEEXT} && exit 1
exit 0