From e237d50390433a4d38944221a6c3280cc6940d9e Mon Sep 17 00:00:00 2001 From: Hye-Shik Chang Date: Tue, 13 Dec 2005 16:44:02 +0000 Subject: 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. --- Misc/NEWS | 3 +++ Objects/fileobject.c | 7 ++++++ configure | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++- configure.in | 22 ++++++++++++++++++ pyconfig.h.in | 3 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS b/Misc/NEWS index d675706..c8e8981 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1? 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. - Bug #1281408: Py_BuildValue now works correct even with unsigned longs diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 259a423..1de520b 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -482,6 +482,13 @@ _portable_fseek(FILE *fp, Py_off_t offset, int whence) static Py_off_t _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) return ftell(fp); #elif defined(HAVE_FTELLO) && SIZEOF_OFF_T >= 8 diff --git a/configure b/configure index 2900799..83078e7 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 39267 . +# From configure.in Revision: 41662 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for python 2.5. # @@ -20118,6 +20118,67 @@ _ACEOF 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 +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 # (which is not required by ISO C or UNIX spec) and/or if we support # tzname[] diff --git a/configure.in b/configure.in index 75a33a1..0550e4f 100644 --- a/configure.in +++ b/configure.in @@ -2955,6 +2955,28 @@ then [Define if poll() sets errno on invalid file descriptors.]) fi +AC_MSG_CHECKING(for broken ftell()) +AC_CACHE_VAL(ac_cv_broken_ftell, [ +AC_TRY_RUN([ +#include +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 # (which is not required by ISO C or UNIX spec) and/or if we support # tzname[] diff --git a/pyconfig.h.in b/pyconfig.h.in index 47723de..2d4fabf 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -46,6 +46,9 @@ /* Define to 1 if you have the header file. */ #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. */ #undef HAVE_BROKEN_NICE -- cgit v0.12