From 8a4163816107dd4b08065498bc614001d1ac4abe Mon Sep 17 00:00:00 2001 From: Richard Frith-MacDonald Date: Tue, 14 Feb 2006 08:30:16 +0000 Subject: [PATCH] Fix availableData bug git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@22486 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 4 ++++ Source/GSFileHandle.m | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index dd8916cd7..7ff399608 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2006-02-14 Richard Frith-Macdonald + * Source/GSFileHandle.m: ([-availabledata]) fix error in last change + as we should block, but not for more than a single byte. + 2006-02-13 Richard Frith-Macdonald * Source/Additions/GSCategories.m: Fix MD5 digest for 64bit CPU diff --git a/Source/GSFileHandle.m b/Source/GSFileHandle.m index 1b384e725..2bc7f40a6 100644 --- a/Source/GSFileHandle.m +++ b/Source/GSFileHandle.m @@ -1260,13 +1260,13 @@ NSString * const GSSOCKSRecvAddr = @"GSSOCKSRecvAddr"; int len; [self checkRead]; - if (isNonBlocking == NO) - { - [self setNonBlocking: YES]; - } d = [NSMutableData dataWithCapacity: 0]; if (isStandardFile) { + if (isNonBlocking == YES) + { + [self setNonBlocking: NO]; + } while ((len = [self read: buf length: sizeof(buf)]) > 0) { [d appendBytes: buf length: len]; @@ -1274,7 +1274,40 @@ NSString * const GSSOCKSRecvAddr = @"GSSOCKSRecvAddr"; } else { + if (isNonBlocking == NO) + { + [self setNonBlocking: YES]; + } len = [self read: buf length: sizeof(buf)]; + + if (len <= 0) + { + if (errno == EAGAIN || errno == EINTR) + { + /* + * Read would have blocked ... so try to get a single character + * in non-blocking mode (to ensure we wait until data arrives) + * and then try again. + * This ensures that we block for *some* data as we should. + */ + [self setNonBlocking: NO]; + len = [self read: buf length: 1]; + [self setNonBlocking: YES]; + if (len == 1) + { + len = [self read: &buf[1] length: sizeof(buf) - 1]; + if (len <= 0) + { + len = 1; + } + else + { + len = len + 1; + } + } + } + } + if (len > 0) { [d appendBytes: buf length: len];