Handle socket failures better.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@13230 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-Macdonald 2002-03-25 12:33:35 +00:00
parent 8654858981
commit 76d0757242
4 changed files with 141 additions and 26 deletions

View file

@ -5,6 +5,8 @@
termination nicely under windoze.
* Source/NSException.m: flush stderr ... under windoze stderr is
not automatically flushed!
* Source/GSWindowsFileHandle.m: watch for exceptional conditions
so we can handle socket failures.
2002-03-22 Richard Frith-Macdonald <rfm@gnu.org>

View file

@ -60,11 +60,11 @@
* Macros to build text to start name server and to give an error
* message about it - they include installation path information.
*/
#define MAKE_GDOMAP_CMD [GSSystemRootDirectory() \
stringByAppendingPathComponent: @"Tools/gdomap"]
#define MAKE_GDOMAP_CMD [[GSSystemRootDirectory() \
stringByAppendingPathComponent: @"Tools"] \
stringByAppendingPathComponent: @"gdomap"]
#define MAKE_GDOMAP_ERR [NSString stringWithFormat: \
@"check that %@/Tools/gdomap is running", \
GSSystemRootDirectory()]
@"check that %@/Tools/gdomap is running", GSSystemRootDirectory()]
#define stringify_it(X) #X
#define make_gdomap_port(X) stringify_it(X)

View file

@ -1214,13 +1214,23 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_RDESC
forMode: [modes objectAtIndex: i]
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: [modes objectAtIndex: i]
all: YES];
}
}
else
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_RDESC
forMode: NSDefaultRunLoopMode
all: YES];
{
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_RDESC
forMode: NSDefaultRunLoopMode
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: NSDefaultRunLoopMode
all: YES];
}
}
- (void) ignoreWriteDescriptor
@ -1229,7 +1239,9 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
NSArray *modes;
if (descriptor < 0)
return;
{
return;
}
l = [NSRunLoop currentRunLoop];
modes = nil;
@ -1251,13 +1263,23 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_WDESC
forMode: [modes objectAtIndex: i]
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: [modes objectAtIndex: i]
all: YES];
}
}
else
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_WDESC
forMode: NSDefaultRunLoopMode
all: YES];
{
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_WDESC
forMode: NSDefaultRunLoopMode
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: NSDefaultRunLoopMode
all: YES];
}
}
- (void) watchReadDescriptorForModes: (NSArray*)modes;
@ -1279,6 +1301,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_RDESC
watcher: self
forMode: [modes objectAtIndex: i]];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: [modes objectAtIndex: i]];
}
[readInfo setObject: modes forKey: NSFileHandleNotificationMonitorModes];
}
@ -1288,6 +1314,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_RDESC
watcher: self
forMode: NSDefaultRunLoopMode];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: NSDefaultRunLoopMode];
}
}
@ -1316,6 +1346,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_WDESC
watcher: self
forMode: [modes objectAtIndex: i]];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: [modes objectAtIndex: i]];
}
}
else
@ -1324,6 +1358,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_WDESC
watcher: self
forMode: NSDefaultRunLoopMode];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: NSDefaultRunLoopMode];
}
}
}
@ -1336,7 +1374,25 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
NSString *operation;
if (isNonBlocking == NO)
[self setNonBlocking: YES];
{
[self setNonBlocking: YES];
}
/*
* An exceptional condition must be treated as a read or write.
*/
if (type == ET_EDESC)
{
if ([writeInfo count] > 0)
{
type = ET_WDESC;
}
else
{
type = ET_RDESC;
}
}
if (type == ET_RDESC)
{
operation = [readInfo objectForKey: NotificationKey];

View file

@ -1062,13 +1062,23 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_RDESC
forMode: [modes objectAtIndex: i]
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: [modes objectAtIndex: i]
all: YES];
}
}
else
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_RDESC
forMode: NSDefaultRunLoopMode
all: YES];
{
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_RDESC
forMode: NSDefaultRunLoopMode
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: NSDefaultRunLoopMode
all: YES];
}
}
- (void) ignoreWriteDescriptor
@ -1077,7 +1087,9 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
NSArray *modes;
if (descriptor < 0)
return;
{
return;
}
l = [NSRunLoop currentRunLoop];
modes = nil;
@ -1099,13 +1111,23 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_WDESC
forMode: [modes objectAtIndex: i]
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: [modes objectAtIndex: i]
all: YES];
}
}
else
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_WDESC
forMode: NSDefaultRunLoopMode
all: YES];
{
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_WDESC
forMode: NSDefaultRunLoopMode
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: NSDefaultRunLoopMode
all: YES];
}
}
- (void) watchReadDescriptorForModes: (NSArray*)modes;
@ -1127,6 +1149,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_RDESC
watcher: self
forMode: [modes objectAtIndex: i]];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: [modes objectAtIndex: i]];
}
[readInfo setObject: modes forKey: NSFileHandleNotificationMonitorModes];
}
@ -1136,14 +1162,19 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_RDESC
watcher: self
forMode: NSDefaultRunLoopMode];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: NSDefaultRunLoopMode];
}
}
- (void) watchWriteDescriptor
{
if (descriptor < 0)
return;
{
return;
}
if ([writeInfo count] > 0)
{
NSMutableDictionary* info = [writeInfo objectAtIndex: 0];
@ -1164,6 +1195,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_WDESC
watcher: self
forMode: [modes objectAtIndex: i]];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: [modes objectAtIndex: i]];
}
}
else
@ -1172,6 +1207,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_WDESC
watcher: self
forMode: NSDefaultRunLoopMode];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: NSDefaultRunLoopMode];
}
}
}
@ -1184,7 +1223,25 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
NSString *operation;
if (isNonBlocking == NO)
[self setNonBlocking: YES];
{
[self setNonBlocking: YES];
}
/*
* If we have an exceptional condition ... treat as a read or write as
* appropriate.
*/
if (type == ET_EDESC)
{
if ([writeInfo count] > 0)
{
type = ET_WDESC;
}
else
{
type = ET_RDESC;
}
}
if (type == ET_RDESC)
{
operation = [readInfo objectForKey: NotificationKey];