From baa2f9424e3017f408dbfd5a5e17582d407b5dd1 Mon Sep 17 00:00:00 2001 From: CaS Date: Sun, 30 Jun 2002 09:43:21 +0000 Subject: [PATCH] File handle changes built under unix git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@13999 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 5 +- Headers/gnustep/base/GSFileHandle.h | 1 + SSL/GSUnixSSLHandle.m | 92 ++++++++++++++++++++--------- Source/GNUmakefile | 7 +-- Source/GSFileHandle.m | 32 ++++++---- Source/Makefile.postamble | 2 +- Source/NSFileHandle.m | 8 --- 7 files changed, 94 insertions(+), 53 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0f31b216b..33ab2869a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,8 +3,9 @@ * Headers/gnustep/base/GSFileHandle.h: New version of UnixFileHandle for combined unix/windoze use. * Source/GSFileHandle.m: New combined unix/windows implementation. - * Source/NSFileHandle.m: Use GSFileHandle under windoze. - * Source/GNUMakefile: Build GSFileHandle under windoze. + * Source/NSFileHandle.m: Use GSFileHandle. + * Source/GNUMakefile: Build GSFileHandle. + * SSL/GSUnixSSLHandle.m: Update for combined GSFileHandle 2002-06-29 Richard Frith-Macdonald diff --git a/Headers/gnustep/base/GSFileHandle.h b/Headers/gnustep/base/GSFileHandle.h index b05ac267d..8ae2577fc 100644 --- a/Headers/gnustep/base/GSFileHandle.h +++ b/Headers/gnustep/base/GSFileHandle.h @@ -41,6 +41,7 @@ BOOL closeOnDealloc; BOOL isStandardFile; BOOL isNullDevice; + BOOL isSocket; BOOL isNonBlocking; BOOL wasNonBlocking; BOOL acceptOK; diff --git a/SSL/GSUnixSSLHandle.m b/SSL/GSUnixSSLHandle.m index d7afaf904..1b0efb300 100644 --- a/SSL/GSUnixSSLHandle.m +++ b/SSL/GSUnixSSLHandle.m @@ -1,4 +1,4 @@ -/** Implementation for GSUnixSSLHandle for GNUStep +/** Implementation for GSSSLHandle for GNUStep Copyright (C) 1997-1999 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald @@ -53,7 +53,7 @@ #include #include -#include +#include #if defined(__MINGW__) #include @@ -89,7 +89,7 @@ static NSString* NotificationKey = @"NSFileHandleNotificationKey"; -@interface GSUnixSSLHandle : UnixFileHandle +@interface GSSSLHandle : GSFileHandle { SSL_CTX *ctx; SSL *ssl; @@ -102,10 +102,10 @@ static NSString* NotificationKey = @"NSFileHandleNotificationKey"; PEMpasswd: (NSString*)PEMpasswd; @end -@implementation GSUnixSSLHandle +@implementation GSSSLHandle + (void) initialize { - if (self == [GSUnixSSLHandle class]) + if (self == [GSSSLHandle class]) { SSL_library_init(); } @@ -121,14 +121,7 @@ static NSString* NotificationKey = @"NSFileHandleNotificationKey"; if (isNonBlocking == YES) [self setNonBlocking: NO]; d = [NSMutableData dataWithCapacity: 0]; - if (isStandardFile) - { - while ((len = read(descriptor, buf, sizeof(buf))) > 0) - { - [d appendBytes: buf length: len]; - } - } - else + if (isSocket) { if (connected) { @@ -139,12 +132,19 @@ static NSString* NotificationKey = @"NSFileHandleNotificationKey"; } else { - if ((len = read(descriptor, buf, sizeof(buf))) > 0) + if ((len = recv(descriptor, buf, sizeof(buf), 0)) > 0) { [d appendBytes: buf length: len]; } } } + else + { + while ((len = read(descriptor, buf, sizeof(buf))) > 0) + { + [d appendBytes: buf length: len]; + } + } if (len < 0) { [NSException raise: NSFileHandleOperationException @@ -201,6 +201,10 @@ static NSString* NotificationKey = @"NSFileHandleNotificationKey"; { got = SSL_read(ssl, buf, chunk); } + else if (isSocket) + { + got = recv(descriptor, buf, chunk, 0); + } else { got = read(descriptor, buf, chunk); @@ -232,11 +236,21 @@ static NSString* NotificationKey = @"NSFileHandleNotificationKey"; if (isNonBlocking == YES) [self setNonBlocking: NO]; d = [NSMutableData dataWithCapacity: 0]; - if (connected) + if (isSocket) { - while ((len = SSL_read(ssl, buf, sizeof(buf))) > 0) + if (connected) { - [d appendBytes: buf length: len]; + while ((len = SSL_read(ssl, buf, sizeof(buf))) > 0) + { + [d appendBytes: buf length: len]; + } + } + else + { + while ((len = recv(descriptor, buf, sizeof(buf), 0)) > 0) + { + [d appendBytes: buf length: len]; + } } } else @@ -289,12 +303,12 @@ static NSString* NotificationKey = @"NSFileHandleNotificationKey"; } else { // Accept attempt completed. - UnixFileHandle *h; + GSSSLHandle *h; struct sockaddr_in sin; int size = sizeof(sin); - h = [[UnixFileHandle alloc] initWithFileDescriptor: desc - closeOnDealloc: YES]; + h = [[GSSSLHandle alloc] initWithFileDescriptor: desc + closeOnDealloc: YES]; getpeername(desc, (struct sockaddr*)&sin, &size); [h setAddr: &sin]; [readInfo setObject: h @@ -338,9 +352,16 @@ static NSString* NotificationKey = @"NSFileHandleNotificationKey"; } else #endif - if (connected) + if (isSocket) { - received = SSL_read(ssl, buf, length); + if (connected) + { + received = SSL_read(ssl, buf, length); + } + else + { + received = recv(descriptor, buf, length, 0); + } } else { @@ -424,10 +445,18 @@ static NSString* NotificationKey = @"NSFileHandleNotificationKey"; } else #endif - if (connected) + if (isSocket) { - written = SSL_write(ssl, (char*)ptr + writePos, - length - writePos); + if (connected) + { + written = SSL_write(ssl, (char*)ptr + writePos, + length - writePos); + } + else + { + written = send(descriptor, (char*)ptr + writePos, + length - writePos, 0); + } } else { @@ -554,7 +583,7 @@ static NSString* NotificationKey = @"NSFileHandleNotificationKey"; str = @"SSL Error: really helpful"; break; default: - str = @"Standard Unix Error: really helpful"; + str = @"Standard system error: really helpful"; break; } NSLog(@"unable to make SSL connection to %@:%@ - %@", @@ -636,9 +665,16 @@ static NSString* NotificationKey = @"NSFileHandleNotificationKey"; { toWrite = NETBUF_SIZE; } - if (connected) + if (isSocket) { - rval = SSL_write(ssl, (char*)ptr+pos, toWrite); + if (connected) + { + rval = SSL_write(ssl, (char*)ptr+pos, toWrite); + } + else + { + rval = send(descriptor, (char*)ptr+pos, toWrite, 0); + } } else { diff --git a/Source/GNUmakefile b/Source/GNUmakefile index 569f1894f..6ab5e4c77 100644 --- a/Source/GNUmakefile +++ b/Source/GNUmakefile @@ -103,9 +103,7 @@ endif endif ifeq ($(GNUSTEP_TARGET_OS), mingw32) -GNU_MFILES += GSFileHandle.m libgnustep-base-entry.m -else -GNU_MFILES += UnixFileHandle.m +GNU_MFILES += libgnustep-base-entry.m endif GNU_CFILES = \ @@ -120,12 +118,12 @@ libgnustep-base.def GNU_HEADERS = \ DistributedObjects.h \ +GSFileHandle.h \ GSLocale.h \ GSUnion.h \ GSIArray.h \ GSIMap.h \ Unicode.h \ -UnixFileHandle.h \ behavior.h \ numbers.h \ objc-gnu2next.h \ @@ -141,6 +139,7 @@ GSArray.m \ GSAttributedString.m \ GSCountedSet.m \ GSDictionary.m \ +GSFileHandle.m \ GSFormat.m \ GSFTPURLHandle.m \ GSHTTPURLHandle.m \ diff --git a/Source/GSFileHandle.m b/Source/GSFileHandle.m index 40d2d0677..69f07cf9d 100644 --- a/Source/GSFileHandle.m +++ b/Source/GSFileHandle.m @@ -749,6 +749,7 @@ NSString * const GSSOCKSRecvAddr = @"GSSOCKSRecvAddr"; { NSMutableDictionary* info; + isSocket = YES; [self setNonBlocking: YES]; if (connect(net, (struct sockaddr*)&sin, sizeof(sin)) < 0) { @@ -867,6 +868,7 @@ NSString * const GSSOCKSRecvAddr = @"GSSOCKSRecvAddr"; self = [self initWithFileDescriptor: net closeOnDealloc: YES]; if (self) { + isSocket = YES; connectOK = NO; acceptOK = YES; readOK = NO; @@ -1056,6 +1058,7 @@ NSString * const GSSOCKSRecvAddr = @"GSSOCKSRecvAddr"; { unsigned long nbio = 0; + isSocket = YES; /* * This is probably a socket ... try * using a socket specific call and see if that fails. @@ -1266,7 +1269,15 @@ NSString * const GSSOCKSRecvAddr = @"GSSOCKSRecvAddr"; } else #endif - if ((len = recv(descriptor, buf, sizeof(buf), 0)) > 0) + if (isSocket) + { + len = recv(descriptor, buf, sizeof(buf), 0); + } + else + { + len = read(descriptor, buf, sizeof(buf)); + } + if (len > 0) { [d appendBytes: buf length: len]; } @@ -1963,6 +1974,7 @@ NSString * const GSSOCKSRecvAddr = @"GSSOCKSRecvAddr"; h = [[GSFileHandle alloc] initWithFileDescriptor: desc closeOnDealloc: YES]; + h->isSocket = YES; getpeername(desc, (struct sockaddr*)&sin, &size); [h setAddr: &sin]; [readInfo setObject: h @@ -2006,13 +2018,13 @@ NSString * const GSSOCKSRecvAddr = @"GSSOCKSRecvAddr"; } else #endif - if (isStandardFile) + if (isSocket) { - received = read(descriptor, buf, length); + received = recv(descriptor, buf, length, 0); } else { - received = recv(descriptor, buf, length, 0); + received = read(descriptor, buf, length); } if (received == 0) { // Read up to end of file. @@ -2091,16 +2103,16 @@ NSString * const GSSOCKSRecvAddr = @"GSSOCKSRecvAddr"; } else #endif - if (isStandardFile) - { - written = write(descriptor, (char*)ptr+writePos, - length-writePos); - } - else + if (isSocket) { written = send(descriptor, (char*)ptr+writePos, length-writePos, 0); } + else + { + written = write(descriptor, (char*)ptr+writePos, + length-writePos); + } if (written <= 0) { if (written < 0 && errno != EAGAIN && errno != EINTR) diff --git a/Source/Makefile.postamble b/Source/Makefile.postamble index 6215d1f68..035c8a9f2 100644 --- a/Source/Makefile.postamble +++ b/Source/Makefile.postamble @@ -174,7 +174,7 @@ NSInvocation.m_FILE_FILTER_OUT_FLAGS = -O% # XML support # $(GNUSTEP_OBJ_DIR)/GSXML.o \ -$(GNUSTEP_OBJ_DIR)/UnixFileHandle.o \ +$(GNUSTEP_OBJ_DIR)/GSFileHandle.o \ : $(GNUSTEP_TARGET_DIR)/config.h # diff --git a/Source/NSFileHandle.m b/Source/NSFileHandle.m index 2f8849cc7..778493588 100644 --- a/Source/NSFileHandle.m +++ b/Source/NSFileHandle.m @@ -32,11 +32,7 @@ #include #include #include -#ifdef __MINGW__ #include -#else -#include -#endif // GNUstep Notification names @@ -61,11 +57,7 @@ static Class NSFileHandle_ssl_class = nil; if (self == [NSFileHandle class]) { NSFileHandle_abstract_class = self; -#ifdef __MINGW__ NSFileHandle_concrete_class = [GSFileHandle class]; -#else - NSFileHandle_concrete_class = [UnixFileHandle class]; -#endif } }