summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2011-04-21 08:27:52 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2011-04-21 08:27:52 (GMT)
commit7d0a560d355159a6a8013f1edc7aedea37e7cf73 (patch)
tree488cf88073be0a3326790028a949d6385f029143
parent7f792b880aa3a8d14f800a2f2bf5af2df9fe36da (diff)
parent81582f76e6fa7e328f9ae6c92cf756e569565818 (diff)
downloadtcl-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--ChangeLog13
-rw-r--r--generic/tcl.h6
-rwxr-xr-xwin/configure69
-rw-r--r--win/configure.in19
-rw-r--r--win/tclWinPort.h19
5 files changed, 119 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index b2a324d..d790f60 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
*/