summaryrefslogtreecommitdiffstats
path: root/generic/tclIO.c
diff options
context:
space:
mode:
authorferrieux <ferrieux@users.sourceforge.net>2009-11-11 00:04:27 (GMT)
committerferrieux <ferrieux@users.sourceforge.net>2009-11-11 00:04:27 (GMT)
commit1f774fe0d6f91f4c57f9f9d409c5f3058e04dc9f (patch)
tree09de7ae1e3d8746aa5d6fc3ef0884d85234fb8be /generic/tclIO.c
parent21b6d0ea71a6fe478c7ce14c003d6b60920f6a96 (diff)
downloadtcl-1f774fe0d6f91f4c57f9f9d409c5f3058e04dc9f.zip
tcl-1f774fe0d6f91f4c57f9f9d409c5f3058e04dc9f.tar.gz
tcl-1f774fe0d6f91f4c57f9f9d409c5f3058e04dc9f.tar.bz2
Backported fix for [Bug 2888099] (close discards ENOSPC error) by
saving the errno from the first of two FlushChannel()s. Uneasy to test; might need specific channel drivers. Four-hands with aku.
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;
}