diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2011-04-21 08:27:52 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2011-04-21 08:27:52 (GMT) |
commit | 7d0a560d355159a6a8013f1edc7aedea37e7cf73 (patch) | |
tree | 488cf88073be0a3326790028a949d6385f029143 | |
parent | 7f792b880aa3a8d14f800a2f2bf5af2df9fe36da (diff) | |
parent | 81582f76e6fa7e328f9ae6c92cf756e569565818 (diff) | |
download | tcl-7d0a560d355159a6a8013f1edc7aedea37e7cf73.zip tcl-7d0a560d355159a6a8013f1edc7aedea37e7cf73.tar.gz tcl-7d0a560d355159a6a8013f1edc7aedea37e7cf73.tar.bz2 |
fix for [Bug 3288345]: Wrong Tcl_StatBuf used on MinGW.
Make sure that all _WIN32 compilers use exactly
the same layout for Tcl_StatBuf - the one used by MSVC6 -
in all situations.
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | generic/tcl.h | 6 | ||||
-rwxr-xr-x | win/configure | 69 | ||||
-rw-r--r-- | win/configure.in | 19 | ||||
-rw-r--r-- | win/tclWinPort.h | 19 |
5 files changed, 119 insertions, 7 deletions
@@ -1,3 +1,11 @@ +2011-04-21 Jan Nijtmans <nijtmans@users.sf.net> + + * generic/tcl.h: fix for [Bug 3288345]: Wrong Tcl_StatBuf + * generic/tclInt.h: used on MinGW. Make sure that all _WIN32 + * win/tclWinFile.c: compilers use exactly the same layout + * win/configure.in: for Tcl_StatBuf - the one used by MSVC6 - + * win/configure: in all situations. + 2011-04-20 Andreas Kupries <andreask@activestate.com> * generic/tclFCmd.c (TclFileAttrsCmd): Added commands to reset the @@ -21,11 +29,6 @@ * generic/tclBasic.c: a Tcl list value is canonical. * generic/tclUtil.c: -2011-04-18 Jan Nijtmans <nijtmans@users.sf.net> - - * generic/tcl.h: fix for [Bug 3288345]: Wrong Tcl_StatBuf - used on MinGW. - 2011-04-16 Donal K. Fellows <dkf@users.sf.net> * generic/tclFCmd.c (TclFileAttrsCmd): Tidied up the memory management diff --git a/generic/tcl.h b/generic/tcl.h index 61e9a8a..1933ded 100644 --- a/generic/tcl.h +++ b/generic/tcl.h @@ -358,10 +358,12 @@ typedef long LONG; typedef struct stati64 Tcl_StatBuf; # define TCL_LL_MODIFIER "L" # else /* __BORLANDC__ */ -# if (defined(_MSC_VER) && (_MSC_VER < 1400)) || !defined(_M_IX86) || defined(__GNUC__) +# if defined(_WIN64) +typedef struct _stat64 Tcl_StatBuf; +# elif (defined(_MSC_VER) && (_MSC_VER < 1400)) typedef struct _stati64 Tcl_StatBuf; # else -typedef struct _stat64 Tcl_StatBuf; +typedef struct _stat32i64 Tcl_StatBuf; # endif /* _MSC_VER < 1400 */ # define TCL_LL_MODIFIER "I64" # endif /* __BORLANDC__ */ diff --git a/win/configure b/win/configure index 632ae99..c397e45 100755 --- a/win/configure +++ b/win/configure @@ -3550,6 +3550,75 @@ _ACEOF fi +# Check to see if struct _stat32i64 exists in mingw's sys/stat.h + +echo "$as_me:$LINENO: checking struct _stat32i64" >&5 +echo $ECHO_N "checking struct _stat32i64... $ECHO_C" >&6 +if test "${tcl_struct_stat32i64+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include <sys/types.h> +#include <sys/stat.h> + +int +main () +{ + + struct _stat32i64 foo; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (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); }; } && + { ac_try='test -s conftest.$ac_objext' + { (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 + tcl_struct_stat32i64=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +tcl_struct_stat32i64=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:$LINENO: result: $tcl_struct_stat32i64" >&5 +echo "${ECHO_T}$tcl_struct_stat32i64" >&6 +if test "$tcl_struct_stat32i64" = "yes" ; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_STRUCT_STAT32I64 1 +_ACEOF + +fi + # See if declarations like FINDEX_INFO_LEVELS are # missing from winbase.h. This is known to be diff --git a/win/configure.in b/win/configure.in index bbd4cd5..c589018 100644 --- a/win/configure.in +++ b/win/configure.in @@ -241,6 +241,25 @@ if test "$tcl_cv_cast_to_union" = "yes"; then [Defined when compiler supports casting to union type.]) fi +# Check to see if struct _stat32i64 exists in mingw's sys/stat.h + +AC_CACHE_CHECK(struct _stat32i64, + tcl_struct_stat32i64, +AC_TRY_COMPILE([ +#include <sys/types.h> +#include <sys/stat.h> +], +[ + struct _stat32i64 foo; +], + tcl_struct_stat32i64=yes, + tcl_struct_stat32i64=no) +) +if test "$tcl_struct_stat32i64" = "yes" ; then + AC_DEFINE(HAVE_STRUCT_STAT32I64, 1, + [Defined when sys/stat.h has struct_stat32i64]) +fi + # See if declarations like FINDEX_INFO_LEVELS are # missing from winbase.h. This is known to be diff --git a/win/tclWinPort.h b/win/tclWinPort.h index 55b95c1..c1317be 100644 --- a/win/tclWinPort.h +++ b/win/tclWinPort.h @@ -105,6 +105,25 @@ #endif /* + * Not all mingw32 versions have this struct. + */ +#if !defined(__BORLANDC__) && !defined(_MSC_VER) && !defined(_WIN64) && !defined(HAVE_STRUCT_STAT32I64) + struct _stat32i64 { + _dev_t st_dev; + _ino_t st_ino; + unsigned short st_mode; + short st_nlink; + short st_uid; + short st_gid; + _dev_t st_rdev; + __int64 st_size; + long st_atime; + long st_mtime; + long st_ctime; + }; +#endif + +/* * The following defines redefine the Windows Socket errors as * BSD errors so Tcl_PosixError can do the right thing. */ |