mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-22 16:33:29 +00:00
Make file handles more robust
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@10524 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
634bf76d28
commit
9d8c0d8391
4 changed files with 70 additions and 22 deletions
|
@ -1,3 +1,11 @@
|
|||
2001-07-19 Richard Frith-Macdonald <rfm@gnu.org>
|
||||
|
||||
* Source/UnixFileHandle.m: Don't abort aread/write attempts that
|
||||
fail on EAGAIN or EINTR ... retry them instead. Avoid unexpected
|
||||
exceptions when trying to write a large volume of data quicker
|
||||
then the output device can handle.
|
||||
* Source/WindowsFileHandle.m: ditto
|
||||
|
||||
2001-07-19 Adam Fedor <fedor@gnu.org>
|
||||
|
||||
* Documentation/readme.texi: Explain the license for GNUstep more
|
||||
|
|
|
@ -1041,7 +1041,8 @@ static Class runLoopClass;
|
|||
else
|
||||
{
|
||||
state = GS_H_UNCON;
|
||||
NSLog(@"connect write attempt failed - %s", GSLastErrorStr(errno));
|
||||
NSLog(@"connect write attempt failed - %s",
|
||||
GSLastErrorStr(errno));
|
||||
}
|
||||
RELEASE(d);
|
||||
}
|
||||
|
|
|
@ -792,16 +792,29 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
|
|||
|
||||
[self checkWrite];
|
||||
if (isNonBlocking == YES)
|
||||
[self setNonBlocking: NO];
|
||||
{
|
||||
[self setNonBlocking: NO];
|
||||
}
|
||||
while (pos < len)
|
||||
{
|
||||
int toWrite = len - pos;
|
||||
|
||||
if (toWrite > NETBUF_SIZE)
|
||||
toWrite = NETBUF_SIZE;
|
||||
{
|
||||
toWrite = NETBUF_SIZE;
|
||||
}
|
||||
rval = write(descriptor, (char*)ptr+pos, toWrite);
|
||||
if (rval < 0)
|
||||
break;
|
||||
{
|
||||
if (errno == EAGAIN || errno == EINTR)
|
||||
{
|
||||
rval = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
pos += rval;
|
||||
}
|
||||
if (rval < 0)
|
||||
|
@ -1271,7 +1284,7 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
|
|||
}
|
||||
else if (received < 0)
|
||||
{
|
||||
if (errno != EAGAIN)
|
||||
if (errno != EAGAIN && errno != EINTR)
|
||||
{
|
||||
NSString *s;
|
||||
|
||||
|
@ -1314,7 +1327,7 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
|
|||
written = write(descriptor, (char*)ptr+writePos, length-writePos);
|
||||
if (written <= 0)
|
||||
{
|
||||
if (errno != EAGAIN)
|
||||
if (written < 0 && errno != EAGAIN && errno != EINTR)
|
||||
{
|
||||
NSString *s;
|
||||
|
||||
|
@ -1662,7 +1675,7 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
|
|||
}
|
||||
else if (received < 0)
|
||||
{
|
||||
if (errno != EAGAIN)
|
||||
if (errno != EAGAIN && errno != EINTR)
|
||||
{
|
||||
NSString *s;
|
||||
|
||||
|
@ -1714,7 +1727,7 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
|
|||
}
|
||||
if (written <= 0)
|
||||
{
|
||||
if (errno != EAGAIN)
|
||||
if (written < 0 && errno != EAGAIN && errno != EINTR)
|
||||
{
|
||||
NSString *s;
|
||||
|
||||
|
@ -1907,13 +1920,17 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
|
|||
|
||||
[self checkWrite];
|
||||
if (isNonBlocking == YES)
|
||||
[self setNonBlocking: NO];
|
||||
{
|
||||
[self setNonBlocking: NO];
|
||||
}
|
||||
while (pos < len)
|
||||
{
|
||||
int toWrite = len - pos;
|
||||
|
||||
if (toWrite > NETBUF_SIZE)
|
||||
toWrite = NETBUF_SIZE;
|
||||
{
|
||||
toWrite = NETBUF_SIZE;
|
||||
}
|
||||
if (connected)
|
||||
{
|
||||
rval = SSL_write(ssl, (char*)ptr+pos, toWrite);
|
||||
|
@ -1923,7 +1940,16 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
|
|||
rval = write(descriptor, (char*)ptr+pos, toWrite);
|
||||
}
|
||||
if (rval < 0)
|
||||
break;
|
||||
{
|
||||
if (errno == EAGAIN == errno == EINTR)
|
||||
{
|
||||
rval = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
pos += rval;
|
||||
}
|
||||
if (rval < 0)
|
||||
|
|
|
@ -731,16 +731,29 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
|
|||
|
||||
[self checkWrite];
|
||||
if (isNonBlocking == YES)
|
||||
[self setNonBlocking: NO];
|
||||
{
|
||||
[self setNonBlocking: NO];
|
||||
}
|
||||
while (pos < len)
|
||||
{
|
||||
int toWrite = len - pos;
|
||||
|
||||
if (toWrite > NETBUF_SIZE)
|
||||
toWrite = NETBUF_SIZE;
|
||||
{
|
||||
toWrite = NETBUF_SIZE;
|
||||
}
|
||||
rval = write(descriptor, (char*)ptr+pos, toWrite);
|
||||
if (rval < 0)
|
||||
break;
|
||||
{
|
||||
if (errno == EAGAIN || errno == EINTR)
|
||||
{
|
||||
rval = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
pos += rval;
|
||||
}
|
||||
if (rval < 0)
|
||||
|
@ -1206,7 +1219,7 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
|
|||
}
|
||||
else if (received < 0)
|
||||
{
|
||||
if (errno != EAGAIN)
|
||||
if (errno != EAGAIN && errno != EINTR)
|
||||
{
|
||||
NSString *s;
|
||||
|
||||
|
@ -1249,12 +1262,12 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
|
|||
written = write(descriptor, (char*)ptr+writePos, length-writePos);
|
||||
if (written <= 0)
|
||||
{
|
||||
if (errno != EAGAIN)
|
||||
if (written < 0 && errno != EAGAIN && errno != EINTR)
|
||||
{
|
||||
NSString *s;
|
||||
|
||||
s = [NSString stringWithFormat:
|
||||
@"Write attempt failed - %s", GSLastErrorStr(errno)];
|
||||
@"Write attempt failed - %s", GSLastErrorStr(errno)];
|
||||
[info setObject: s forKey: GSFileHandleNotificationError];
|
||||
[self postWriteNotification];
|
||||
}
|
||||
|
@ -1275,13 +1288,13 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
|
|||
int len = sizeof(result);
|
||||
|
||||
if (getsockopt(descriptor, SOL_SOCKET, SO_ERROR,
|
||||
(char*)&result, &len) == 0 && result != 0)
|
||||
(char*)&result, &len) == 0 && result != 0)
|
||||
{
|
||||
NSString *s;
|
||||
NSString *s;
|
||||
|
||||
s = [NSString stringWithFormat: @"Connect attempt failed - %s",
|
||||
GSLastErrorStr(result)];
|
||||
[info setObject: s forKey: GSFileHandleNotificationError];
|
||||
s = [NSString stringWithFormat: @"Connect attempt failed - %s",
|
||||
GSLastErrorStr(result)];
|
||||
[info setObject: s forKey: GSFileHandleNotificationError];
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue