From 76d0757242f12f24d91f78a3d0fcd372e4f9fc6a Mon Sep 17 00:00:00 2001 From: Richard Frith-Macdonald Date: Mon, 25 Mar 2002 12:33:35 +0000 Subject: [PATCH] Handle socket failures better. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@13230 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 2 + Source/NSPortNameServer.m | 8 ++-- Source/UnixFileHandle.m | 76 ++++++++++++++++++++++++++++++----- Source/WindowsFileHandle.m | 81 ++++++++++++++++++++++++++++++++------ 4 files changed, 141 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index df74b6d71..2b252b414 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/Source/NSPortNameServer.m b/Source/NSPortNameServer.m index 81e288e91..184a2ca4c 100644 --- a/Source/NSPortNameServer.m +++ b/Source/NSPortNameServer.m @@ -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) diff --git a/Source/UnixFileHandle.m b/Source/UnixFileHandle.m index 2c67c4cb3..f5eba3e7b 100644 --- a/Source/UnixFileHandle.m +++ b/Source/UnixFileHandle.m @@ -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]; diff --git a/Source/WindowsFileHandle.m b/Source/WindowsFileHandle.m index 57dd67686..39708d3c8 100644 --- a/Source/WindowsFileHandle.m +++ b/Source/WindowsFileHandle.m @@ -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];