From 841c2af7dcfcd20b68bd3f05f5ecce6498b35a18 Mon Sep 17 00:00:00 2001 From: patthoyts Date: Fri, 4 Nov 2005 18:33:34 +0000 Subject: * win/tclWinPipe.c: Applied patch #1267871 by Matt Newman which * win/tclWinPort.h: provides extended error code support. * tests/exec.test: Wrote some tests for this feature. --- ChangeLog | 6 ++++++ tests/exec.test | 47 ++++++++++++++++++++++++++++++++++++++++++++++- win/tclWinPipe.c | 20 ++++++++------------ win/tclWinPort.h | 10 +++++----- 4 files changed, 65 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 629f7e0..640d9fb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-11-04 Pat Thoyts + + * win/tclWinPipe.c: Applied patch #1267871 by Matt Newman which + * win/tclWinPort.h: provides extended error code support. + * tests/exec.test: Wrote some tests for this feature. + 2005-11-04 Kevin Kenny * compat/strftime.c: Fixed a problem where the name of the diff --git a/tests/exec.test b/tests/exec.test index bb6ecd4..0dccf37 100644 --- a/tests/exec.test +++ b/tests/exec.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: exec.test,v 1.16.2.5 2005/07/28 15:27:59 dkf Exp $ +# RCS: @(#) $Id: exec.test,v 1.16.2.6 2005/11/04 18:33:35 patthoyts Exp $ package require tcltest 2 namespace import -force ::tcltest::* @@ -485,6 +485,51 @@ test exec-13.3 {setting errorCode variable} {exec} { [string tolower [lrange $errorCode 2 end]] } {1 {couldn't execute "_weird_cmd_": no such file or directory} POSIX {{no such file or directory}}} +test exec-13.4 {extended exit result codes} { + -constraints {win} + -setup { + set tmp [makeFile {exit 0x00000101} tmpfile.exec-13.4] + } + -body { + list [catch {exec [interpreter] $tmp} err]\ + [lreplace $::errorCode 1 1 {}] + } + -cleanup { + removeFile $tmp + } + -result {1 {CHILDSTATUS {} 257}} +} + +test exec-13.5 {extended exit result codes: max value} { + -constraints {win} + -setup { + set tmp [makeFile {exit 0x3fffffff} tmpfile.exec-13.5] + } + -body { + list [catch {exec [interpreter] $tmp} err]\ + [lreplace $::errorCode 1 1 {}] + } + -cleanup { + removeFile $tmp + } + -result {1 {CHILDSTATUS {} 1073741823}} +} + +test exec-13.6 {extended exit result codes: signalled} { + -constraints {win} + -setup { + set tmp [makeFile {exit 0xffffffff} tmpfile.exec-13.6] + } + -body { + list [catch {exec [interpreter] $tmp} err]\ + [lreplace $::errorCode 1 1 {}] + } + -cleanup { + removeFile $tmp + } + -result {1 {CHILDKILLED {} SIGABRT SIGABRT}} +} + # Switches before the first argument test exec-14.1 {-keepnewline switch} {exec} { diff --git a/win/tclWinPipe.c b/win/tclWinPipe.c index dc9a917..8dc41d0 100644 --- a/win/tclWinPipe.c +++ b/win/tclWinPipe.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWinPipe.c,v 1.33.2.14 2005/07/28 15:27:59 dkf Exp $ + * RCS: @(#) $Id: tclWinPipe.c,v 1.33.2.15 2005/11/04 18:33:35 patthoyts Exp $ */ #include "tclWinInt.h" @@ -2576,12 +2576,12 @@ Tcl_WaitPid( case EXCEPTION_FLT_UNDERFLOW: case EXCEPTION_INT_DIVIDE_BY_ZERO: case EXCEPTION_INT_OVERFLOW: - *statPtr = SIGFPE; + *statPtr = 0xC0000000 | SIGFPE; break; case EXCEPTION_PRIV_INSTRUCTION: case EXCEPTION_ILLEGAL_INSTRUCTION: - *statPtr = SIGILL; + *statPtr = 0xC0000000 | SIGILL; break; case EXCEPTION_ACCESS_VIOLATION: @@ -2592,28 +2592,24 @@ Tcl_WaitPid( case EXCEPTION_INVALID_DISPOSITION: case EXCEPTION_GUARD_PAGE: case EXCEPTION_INVALID_HANDLE: - *statPtr = SIGSEGV; + *statPtr = 0xC0000000 | SIGSEGV; break; case CONTROL_C_EXIT: - *statPtr = SIGINT; + *statPtr = 0xC0000000 | SIGINT; break; default: - *statPtr = SIGABRT; + *statPtr = 0xC0000000 | SIGABRT; break; } } else { - /* - * Non exception, normal, exit code. Note that the exit code - * is truncated to a byte range. - */ - *statPtr = ((exitCode << 8) & 0xff00); + *statPtr = exitCode; } result = pid; } else { errno = ECHILD; - *statPtr = ECHILD; + *statPtr = 0xC0000000 | ECHILD; result = (Tcl_Pid) -1; } diff --git a/win/tclWinPort.h b/win/tclWinPort.h index 47545ba..4062d6c 100644 --- a/win/tclWinPort.h +++ b/win/tclWinPort.h @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWinPort.h,v 1.36.2.1 2005/10/05 08:02:20 hobbs Exp $ + * RCS: @(#) $Id: tclWinPort.h,v 1.36.2.2 2005/11/04 18:33:35 patthoyts Exp $ */ #ifndef _TCLWINPORT @@ -230,15 +230,15 @@ #endif /* TCL_UNION_WAIT */ #ifndef WIFEXITED -# define WIFEXITED(stat) (((*((int *) &(stat))) & 0xff) == 0) +# define WIFEXITED(stat) (((*((int *) &(stat))) & 0xC0000000) == 0) #endif #ifndef WEXITSTATUS -# define WEXITSTATUS(stat) (((*((int *) &(stat))) >> 8) & 0xff) +# define WEXITSTATUS(stat) (*((int *) &(stat))) #endif #ifndef WIFSIGNALED -# define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) & 0x00ff))) +# define WIFSIGNALED(stat) ((*((int *) &(stat))) & 0xC0000000) #endif #ifndef WTERMSIG @@ -246,7 +246,7 @@ #endif #ifndef WIFSTOPPED -# define WIFSTOPPED(stat) (((*((int *) &(stat))) & 0xff) == 0177) +# define WIFSTOPPED(stat) 0 #endif #ifndef WSTOPSIG -- cgit v0.12