Index: tclIO.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclIO.c,v
retrieving revision 1.168
diff -u -r1.168 tclIO.c
--- tclIO.c	18 Nov 2009 22:41:41 -0000	1.168
+++ tclIO.c	1 Dec 2009 01:11:05 -0000
@@ -3831,6 +3831,29 @@
     }
 }
 
+static void WillWrite(Channel *chanPtr)
+{
+    if ((chanPtr->typePtr->seekProc != NULL)
+        && (Tcl_InputBuffered((Tcl_Channel) chanPtr) > 0)) {
+        DiscardInputQueued(chanPtr->state, 0);
+    }
+}
+
+static int WillRead(Channel *chanPtr)
+{
+    if ((chanPtr->typePtr->seekProc != NULL)
+        && (Tcl_OutputBuffered((Tcl_Channel) chanPtr) > 0)) {
+        if ((chanPtr->state->curOutPtr != NULL)
+            && IsBufferReady(chanPtr->state->curOutPtr)) {
+            SetFlag(chanPtr->state, BUFFER_READY);
+        }
+        if (FlushChannel(NULL, chanPtr, 0) != 0) {
+            return -1;
+        }
+    }
+    return 0;
+}
+
 /*
  *----------------------------------------------------------------------
  *
@@ -3864,6 +3887,10 @@
     char *dst;
     int dstMax, sawLF, savedLF, total, dstLen, toWrite, translate;
 
+    if (srcLen) {
+        WillWrite(chanPtr);
+    }
+
     total = 0;
     sawLF = 0;
     savedLF = 0;
@@ -3965,6 +3992,10 @@
     Tcl_Encoding encoding;
     char safe[BUFFER_PADDING];
 
+    if (srcLen) {
+        WillWrite(chanPtr);
+    }
+
     total = 0;
     sawLF = 0;
     savedLF = 0;
@@ -5782,6 +5813,10 @@
     src = RemovePoint(bufPtr);
     srcLen = BytesLeft(bufPtr);
 
+    if (bytesToRead && (WillRead(statePtr->topChanPtr) < 0)) {
+        return -1;
+    }
+
     toRead = bytesToRead;
     if ((unsigned) toRead > (unsigned) srcLen) {
 	toRead = srcLen;
@@ -5894,6 +5929,10 @@
     src = RemovePoint(bufPtr);
     srcLen = BytesLeft(bufPtr);
 
+    if (WillRead(statePtr->topChanPtr) < 0) {
+        return -1;
+    }
+
     toRead = charsToRead;
     if ((unsigned) toRead > (unsigned) srcLen) {
 	toRead = srcLen;
@@ -7035,8 +7074,10 @@
      * pre-read input data.
      */
 
-    if (Tcl_Seek(chan, (Tcl_WideInt) 0, SEEK_CUR) == Tcl_LongAsWide(-1)) {
-	return TCL_ERROR;
+    WillWrite(chanPtr);
+
+    if (WillRead(chanPtr) < 0) {
+        return TCL_ERROR;
     }
 
     /*
