summaryrefslogtreecommitdiffstats
path: root/generic/tclIO.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r--generic/tclIO.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index fe5ea86..2b57079 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -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: tclIO.c,v 1.137.2.13 2009/10/23 19:09:02 andreas_kupries Exp $
+ * RCS: @(#) $Id: tclIO.c,v 1.137.2.14 2009/11/11 00:04:27 ferrieux Exp $
*/
#include "tclInt.h"
@@ -2922,6 +2922,7 @@ Tcl_Close(
ChannelState *statePtr; /* State of real IO channel. */
int result; /* Of calling FlushChannel. */
int flushcode;
+ int stickyError;
if (chan == NULL) {
return TCL_OK;
@@ -2963,10 +2964,14 @@ Tcl_Close(
* iso2022, the terminated escape sequence must write to the buffer.
*/
+ stickyError = 0;
+
if ((statePtr->encoding != NULL) && (statePtr->curOutPtr != NULL)
&& (CheckChannelErrors(statePtr, TCL_WRITABLE) == 0)) {
statePtr->outputEncodingFlags |= TCL_ENCODING_END;
- WriteChars(chanPtr, "", 0);
+ if (WriteChars(chanPtr, "", 0) < 0) {
+ stickyError = Tcl_GetErrno();
+ }
/*
* TIP #219, Tcl Channel Reflection API.
@@ -3045,6 +3050,14 @@ Tcl_Close(
result = EINVAL;
}
+ if (stickyError != 0) {
+ Tcl_SetErrno(stickyError);
+ if (interp != NULL) {
+ Tcl_SetObjResult(interp,
+ Tcl_NewStringObj(Tcl_PosixError(interp), -1));
+ }
+ flushcode = -1;
+ }
if ((flushcode != 0) || (result != 0)) {
return TCL_ERROR;
}