Author: rwinston Date: Wed Mar 5 01:25:48 2008 New Revision: 633798 URL: http://svn.apache.org/viewvc?rev=633798&view=rev Log: Add missing patch (NET-73)
Modified: commons/proper/net/branches/NET_2_0/src/main/java/org/apache/commons/net/telnet/TelnetInputStream.java Modified: commons/proper/net/branches/NET_2_0/src/main/java/org/apache/commons/net/telnet/TelnetInputStream.java URL: http://svn.apache.org/viewvc/commons/proper/net/branches/NET_2_0/src/main/java/org/apache/commons/net/telnet/TelnetInputStream.java?rev=633798&r1=633797&r2=633798&view=diff ============================================================================== --- commons/proper/net/branches/NET_2_0/src/main/java/org/apache/commons/net/telnet/TelnetInputStream.java (original) +++ commons/proper/net/branches/NET_2_0/src/main/java/org/apache/commons/net/telnet/TelnetInputStream.java Wed Mar 5 01:25:48 2008 @@ -106,14 +106,19 @@ // TelnetOutputStream writing through the telnet client at same time // as a processDo/Will/etc. command invoked from TelnetInputStream // tries to write. - private int __read() throws IOException + private int __read(boolean mayBlock) throws IOException { int ch; _loop: while (true) { - // Exit only when we reach end of stream. + + // If there is no more data AND we were told not to block, just return -2. (More efficient than exception.) + if(!mayBlock && super.available() == 0) + return -2; + + // Otherwise, exit only when we reach end of stream. if ((ch = super.read()) < 0) return -1; @@ -360,12 +365,13 @@ //__alreadyread = false; __readIsWaiting = true; int ch; - + boolean mayBlock = true; // block on the first read only + do { try { - if ((ch = __read()) < 0) + if ((ch = __read(mayBlock)) < 0) if(ch != -2) return (ch); } @@ -399,6 +405,11 @@ if (__isClosed) return (-1); } + + // Reads should not block on subsequent iterations. Potentially, this could happen if the + // remaining buffered socket data consists entirely of Telnet command sequence and no "user" data. + mayBlock = false; + } // Continue reading as long as there is data available and the queue is not full. while (super.available() > 0 && __bytesAvailable < __queue.length - 1); @@ -544,7 +555,7 @@ { try { - if ((ch = __read()) < 0) + if ((ch = __read(true)) < 0) break; } catch (InterruptedIOException e)