Commit e237d503 authored by Hye-Shik Chang's avatar Hye-Shik Chang

Add a workaround for file.ftell() to raise IOError for ttys.

ftell(3) on BSD doesn't set errno even for ttys and returns useless
values.
parent 50f8169f
...@@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1? ...@@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1?
Core and builtins Core and builtins
----------------- -----------------
- Added a workaround for file.tell() to raise IOError when the file
is a tty on every platforms as documented in our library reference.
- Patch #1350409: Work around signal handling bug in Visual Studio 2005. - Patch #1350409: Work around signal handling bug in Visual Studio 2005.
- Bug #1281408: Py_BuildValue now works correct even with unsigned longs - Bug #1281408: Py_BuildValue now works correct even with unsigned longs
......
...@@ -482,6 +482,13 @@ _portable_fseek(FILE *fp, Py_off_t offset, int whence) ...@@ -482,6 +482,13 @@ _portable_fseek(FILE *fp, Py_off_t offset, int whence)
static Py_off_t static Py_off_t
_portable_ftell(FILE* fp) _portable_ftell(FILE* fp)
{ {
#ifdef HAVE_BROKEN_FTELL
/* ftell doesn't fail for tty fds on FreeBSD and some others */
if (isatty(fileno(fp))) {
errno = ESPIPE;
return -1;
}
#endif
#if !defined(HAVE_LARGEFILE_SUPPORT) #if !defined(HAVE_LARGEFILE_SUPPORT)
return ftell(fp); return ftell(fp);
#elif defined(HAVE_FTELLO) && SIZEOF_OFF_T >= 8 #elif defined(HAVE_FTELLO) && SIZEOF_OFF_T >= 8
......
#! /bin/sh #! /bin/sh
# From configure.in Revision: 39267 . # From configure.in Revision: 41662 .
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.59 for python 2.5. # Generated by GNU Autoconf 2.59 for python 2.5.
# #
...@@ -20118,6 +20118,67 @@ _ACEOF ...@@ -20118,6 +20118,67 @@ _ACEOF
fi fi
echo "$as_me:$LINENO: checking for broken ftell()" >&5
echo $ECHO_N "checking for broken ftell()... $ECHO_C" >&6
if test "${ac_cv_broken_ftell+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test "$cross_compiling" = yes; then
ac_cv_broken_ftell=no
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <stdio.h>
int main()
{
long val = ftell(stdin);
if (val != -1)
exit(0);
exit(1);
}
_ACEOF
rm -f conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_broken_ftell=yes
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
ac_cv_broken_ftell=no
fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
echo "$as_me:$LINENO: result: $ac_cv_broken_ftell" >&5
echo "${ECHO_T}$ac_cv_broken_ftell" >&6
if test "$ac_cv_broken_ftell" = yes
then
cat >>confdefs.h <<\_ACEOF
#define HAVE_BROKEN_FTELL 1
_ACEOF
fi
# Before we can test tzset, we need to check if struct tm has a tm_zone # Before we can test tzset, we need to check if struct tm has a tm_zone
# (which is not required by ISO C or UNIX spec) and/or if we support # (which is not required by ISO C or UNIX spec) and/or if we support
# tzname[] # tzname[]
......
...@@ -2955,6 +2955,28 @@ then ...@@ -2955,6 +2955,28 @@ then
[Define if poll() sets errno on invalid file descriptors.]) [Define if poll() sets errno on invalid file descriptors.])
fi fi
AC_MSG_CHECKING(for broken ftell())
AC_CACHE_VAL(ac_cv_broken_ftell, [
AC_TRY_RUN([
#include <stdio.h>
int main()
{
long val = ftell(stdin);
if (val != -1)
exit(0);
exit(1);
}
],
ac_cv_broken_ftell=yes,
ac_cv_broken_ftell=no,
ac_cv_broken_ftell=no)])
AC_MSG_RESULT($ac_cv_broken_ftell)
if test "$ac_cv_broken_ftell" = yes
then
AC_DEFINE(HAVE_BROKEN_FTELL, 1,
[Define if ftell() set errno on tty files.])
fi
# Before we can test tzset, we need to check if struct tm has a tm_zone # Before we can test tzset, we need to check if struct tm has a tm_zone
# (which is not required by ISO C or UNIX spec) and/or if we support # (which is not required by ISO C or UNIX spec) and/or if we support
# tzname[] # tzname[]
......
...@@ -46,6 +46,9 @@ ...@@ -46,6 +46,9 @@
/* Define to 1 if you have the <bluetooth.h> header file. */ /* Define to 1 if you have the <bluetooth.h> header file. */
#undef HAVE_BLUETOOTH_H #undef HAVE_BLUETOOTH_H
/* Define if ftell() set errno on tty files. */
#undef HAVE_BROKEN_FTELL
/* Define if nice() returns success/failure instead of the new priority. */ /* Define if nice() returns success/failure instead of the new priority. */
#undef HAVE_BROKEN_NICE #undef HAVE_BROKEN_NICE
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment