diff options
author | jan.nijtmans <jan.nijtmans@noemail.net> | 2011-04-21 08:27:52 (GMT) |
---|---|---|
committer | jan.nijtmans <jan.nijtmans@noemail.net> | 2011-04-21 08:27:52 (GMT) |
commit | 907d92a093bacc82d868a9dbf3a434ff833fdb8d (patch) | |
tree | 488cf88073be0a3326790028a949d6385f029143 /win | |
parent | 8bec3b27d29968e776f1f408564341dec68eb7af (diff) | |
parent | 5c8e168ce34679150cff92de81ebda79a6739536 (diff) | |
download | tcl-907d92a093bacc82d868a9dbf3a434ff833fdb8d.zip tcl-907d92a093bacc82d868a9dbf3a434ff833fdb8d.tar.gz tcl-907d92a093bacc82d868a9dbf3a434ff833fdb8d.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.
FossilOrigin-Name: 7fd2f5f049b7a86e52c48fdb0aade75418cca77d
Diffstat (limited to 'win')
-rwxr-xr-x | win/configure | 69 | ||||
-rw-r--r-- | win/configure.in | 19 | ||||
-rw-r--r-- | win/tclWinPort.h | 19 |
3 files changed, 107 insertions, 0 deletions
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. */ |