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. termination nicely under windoze.
* Source/NSException.m: flush stderr ... under windoze stderr is * Source/NSException.m: flush stderr ... under windoze stderr is
not automatically flushed! 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> 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 * Macros to build text to start name server and to give an error
* message about it - they include installation path information. * message about it - they include installation path information.
*/ */
#define MAKE_GDOMAP_CMD [GSSystemRootDirectory() \ #define MAKE_GDOMAP_CMD [[GSSystemRootDirectory() \
stringByAppendingPathComponent: @"Tools/gdomap"] stringByAppendingPathComponent: @"Tools"] \
stringByAppendingPathComponent: @"gdomap"]
#define MAKE_GDOMAP_ERR [NSString stringWithFormat: \ #define MAKE_GDOMAP_ERR [NSString stringWithFormat: \
@"check that %@/Tools/gdomap is running", \ @"check that %@/Tools/gdomap is running", GSSystemRootDirectory()]
GSSystemRootDirectory()]
#define stringify_it(X) #X #define stringify_it(X) #X
#define make_gdomap_port(X) stringify_it(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 type: ET_RDESC
forMode: [modes objectAtIndex: i] forMode: [modes objectAtIndex: i]
all: YES]; all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: [modes objectAtIndex: i]
all: YES];
} }
} }
else else
[l removeEvent: (void*)(gsaddr)descriptor {
type: ET_RDESC [l removeEvent: (void*)(gsaddr)descriptor
forMode: NSDefaultRunLoopMode type: ET_RDESC
all: YES]; forMode: NSDefaultRunLoopMode
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: NSDefaultRunLoopMode
all: YES];
}
} }
- (void) ignoreWriteDescriptor - (void) ignoreWriteDescriptor
@ -1229,7 +1239,9 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
NSArray *modes; NSArray *modes;
if (descriptor < 0) if (descriptor < 0)
return; {
return;
}
l = [NSRunLoop currentRunLoop]; l = [NSRunLoop currentRunLoop];
modes = nil; modes = nil;
@ -1251,13 +1263,23 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_WDESC type: ET_WDESC
forMode: [modes objectAtIndex: i] forMode: [modes objectAtIndex: i]
all: YES]; all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: [modes objectAtIndex: i]
all: YES];
} }
} }
else else
[l removeEvent: (void*)(gsaddr)descriptor {
type: ET_WDESC [l removeEvent: (void*)(gsaddr)descriptor
forMode: NSDefaultRunLoopMode type: ET_WDESC
all: YES]; forMode: NSDefaultRunLoopMode
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: NSDefaultRunLoopMode
all: YES];
}
} }
- (void) watchReadDescriptorForModes: (NSArray*)modes; - (void) watchReadDescriptorForModes: (NSArray*)modes;
@ -1279,6 +1301,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_RDESC type: ET_RDESC
watcher: self watcher: self
forMode: [modes objectAtIndex: i]]; forMode: [modes objectAtIndex: i]];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: [modes objectAtIndex: i]];
} }
[readInfo setObject: modes forKey: NSFileHandleNotificationMonitorModes]; [readInfo setObject: modes forKey: NSFileHandleNotificationMonitorModes];
} }
@ -1288,6 +1314,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_RDESC type: ET_RDESC
watcher: self watcher: self
forMode: NSDefaultRunLoopMode]; 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 type: ET_WDESC
watcher: self watcher: self
forMode: [modes objectAtIndex: i]]; forMode: [modes objectAtIndex: i]];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: [modes objectAtIndex: i]];
} }
} }
else else
@ -1324,6 +1358,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_WDESC type: ET_WDESC
watcher: self watcher: self
forMode: NSDefaultRunLoopMode]; 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; NSString *operation;
if (isNonBlocking == NO) 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) if (type == ET_RDESC)
{ {
operation = [readInfo objectForKey: NotificationKey]; operation = [readInfo objectForKey: NotificationKey];

View file

@ -1062,13 +1062,23 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_RDESC type: ET_RDESC
forMode: [modes objectAtIndex: i] forMode: [modes objectAtIndex: i]
all: YES]; all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: [modes objectAtIndex: i]
all: YES];
} }
} }
else else
[l removeEvent: (void*)(gsaddr)descriptor {
type: ET_RDESC [l removeEvent: (void*)(gsaddr)descriptor
forMode: NSDefaultRunLoopMode type: ET_RDESC
all: YES]; forMode: NSDefaultRunLoopMode
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: NSDefaultRunLoopMode
all: YES];
}
} }
- (void) ignoreWriteDescriptor - (void) ignoreWriteDescriptor
@ -1077,7 +1087,9 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
NSArray *modes; NSArray *modes;
if (descriptor < 0) if (descriptor < 0)
return; {
return;
}
l = [NSRunLoop currentRunLoop]; l = [NSRunLoop currentRunLoop];
modes = nil; modes = nil;
@ -1099,13 +1111,23 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_WDESC type: ET_WDESC
forMode: [modes objectAtIndex: i] forMode: [modes objectAtIndex: i]
all: YES]; all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: [modes objectAtIndex: i]
all: YES];
} }
} }
else else
[l removeEvent: (void*)(gsaddr)descriptor {
type: ET_WDESC [l removeEvent: (void*)(gsaddr)descriptor
forMode: NSDefaultRunLoopMode type: ET_WDESC
all: YES]; forMode: NSDefaultRunLoopMode
all: YES];
[l removeEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
forMode: NSDefaultRunLoopMode
all: YES];
}
} }
- (void) watchReadDescriptorForModes: (NSArray*)modes; - (void) watchReadDescriptorForModes: (NSArray*)modes;
@ -1127,6 +1149,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_RDESC type: ET_RDESC
watcher: self watcher: self
forMode: [modes objectAtIndex: i]]; forMode: [modes objectAtIndex: i]];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: [modes objectAtIndex: i]];
} }
[readInfo setObject: modes forKey: NSFileHandleNotificationMonitorModes]; [readInfo setObject: modes forKey: NSFileHandleNotificationMonitorModes];
} }
@ -1136,14 +1162,19 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_RDESC type: ET_RDESC
watcher: self watcher: self
forMode: NSDefaultRunLoopMode]; forMode: NSDefaultRunLoopMode];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: NSDefaultRunLoopMode];
} }
} }
- (void) watchWriteDescriptor - (void) watchWriteDescriptor
{ {
if (descriptor < 0) if (descriptor < 0)
return; {
return;
}
if ([writeInfo count] > 0) if ([writeInfo count] > 0)
{ {
NSMutableDictionary* info = [writeInfo objectAtIndex: 0]; NSMutableDictionary* info = [writeInfo objectAtIndex: 0];
@ -1164,6 +1195,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_WDESC type: ET_WDESC
watcher: self watcher: self
forMode: [modes objectAtIndex: i]]; forMode: [modes objectAtIndex: i]];
[l addEvent: (void*)(gsaddr)descriptor
type: ET_EDESC
watcher: self
forMode: [modes objectAtIndex: i]];
} }
} }
else else
@ -1172,6 +1207,10 @@ getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin)
type: ET_WDESC type: ET_WDESC
watcher: self watcher: self
forMode: NSDefaultRunLoopMode]; 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; NSString *operation;
if (isNonBlocking == NO) 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) if (type == ET_RDESC)
{ {
operation = [readInfo objectForKey: NotificationKey]; operation = [readInfo objectForKey: NotificationKey];