mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-10 16:20:42 +00:00
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:
parent
8654858981
commit
76d0757242
4 changed files with 141 additions and 26 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Reference in a new issue