Merge pull request #307 from gnustep/Eggplant-Improved-IPv6-Support

Initial commit of updated IPv6
This commit is contained in:
rfm 2023-08-18 11:18:50 +01:00 committed by GitHub
commit 5912f4ed6f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 30 deletions

View file

@ -87,7 +87,7 @@
if ([host length] > 0) if ([host length] > 0)
{ {
[urlString appendString: [urlString appendString:
[host stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; [host stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLHostAllowedCharacterSet]]];
} }
if ([port intValue] > 0) if ([port intValue] > 0)
{ {

View file

@ -30,7 +30,7 @@
#import "GSNetwork.h" #import "GSNetwork.h"
typedef union { typedef union {
struct sockaddr s; struct sockaddr_storage s; /* Increased memory allocation for IPv6 addresses*/
struct sockaddr_in i4; struct sockaddr_in i4;
#ifdef AF_INET6 #ifdef AF_INET6
struct sockaddr_in6 i6; struct sockaddr_in6 i6;
@ -59,12 +59,12 @@ SOCKIVARS
/** /**
* get the sockaddr * get the sockaddr
*/ */
- (struct sockaddr*) _address; - (struct sockaddr_storage*) _address;
/** /**
* set the sockaddr * set the sockaddr
*/ */
- (void) _setAddress: (struct sockaddr*)address; - (void) _setAddress: (struct sockaddr_storage*)address;
/** /**
* setter for closing flag ... the remote end has stopped either sending * setter for closing flag ... the remote end has stopped either sending
@ -116,8 +116,8 @@ SOCKIVARS
SOCKIVARS SOCKIVARS
@end @end
@interface GSSocketInputStream (AddedBehaviors) @interface GSSocketInputStream (AddedBehaviors)
- (struct sockaddr*) _address; - (struct sockaddr_storage*) _address;
- (void) _setAddress: (struct sockaddr*)address; - (void) _setAddress: (struct sockaddr_storage*)address;
- (NSInteger) _read: (uint8_t *)buffer maxLength: (NSUInteger)len; - (NSInteger) _read: (uint8_t *)buffer maxLength: (NSUInteger)len;
- (void) _setClosing: (BOOL)passive; - (void) _setClosing: (BOOL)passive;
- (void) _setHandler: (id)h; - (void) _setHandler: (id)h;
@ -158,8 +158,8 @@ SOCKIVARS
SOCKIVARS SOCKIVARS
@end @end
@interface GSSocketOutputStream (AddedBehaviors) @interface GSSocketOutputStream (AddedBehaviors)
- (struct sockaddr*) _address; - (struct sockaddr_storage*) _address;
- (void) _setAddress: (struct sockaddr*)address; - (void) _setAddress: (struct sockaddr_storage*)address;
- (void) _setClosing: (BOOL)passive; - (void) _setClosing: (BOOL)passive;
- (void) _setHandler: (id)h; - (void) _setHandler: (id)h;
- (void) _setPassive: (BOOL)passive; - (void) _setPassive: (BOOL)passive;
@ -214,8 +214,8 @@ SOCKIVARS
@end @end
@interface GSSocketServerStream (AddedBehaviors) @interface GSSocketServerStream (AddedBehaviors)
- (struct sockaddr*) _address; - (struct sockaddr_storage*) _address;
- (void) _setAddress: (struct sockaddr*)address; - (void) _setAddress: (struct sockaddr_storage*)address;
- (void) _setClosing: (BOOL)passive; - (void) _setClosing: (BOOL)passive;
- (void) _setHandler: (id)h; - (void) _setHandler: (id)h;
- (void) _setPassive: (BOOL)passive; - (void) _setPassive: (BOOL)passive;

View file

@ -943,7 +943,7 @@ static NSString * const GSSOCKSAckConn = @"GSSOCKSAckConn";
if (conf != nil) if (conf != nil)
{ {
GSSOCKS *h; GSSOCKS *h;
struct sockaddr *sa = [i _address]; struct sockaddr_storage *sa = [i _address];
NSString *v; NSString *v;
BOOL i6 = NO; BOOL i6 = NO;
@ -958,15 +958,15 @@ static NSString * const GSSOCKSAckConn = @"GSSOCKSAckConn";
} }
#if defined(AF_INET6) #if defined(AF_INET6)
if (sa->sa_family == AF_INET6) if (sa->ss_family == AF_INET6)
{ {
i6 = YES; i6 = YES;
} }
else else
#endif #endif
if (sa->sa_family != AF_INET) if (sa->ss_family != AF_INET)
{ {
GSOnceMLog(@"SOCKS not supported for socket type %d", sa->sa_family); GSOnceMLog(@"SOCKS not supported for socket type %d", sa->ss_family);
return; return;
} }
@ -1563,12 +1563,12 @@ setNonBlocking(SOCKET fd)
#endif #endif
_sock = INVALID_SOCKET; _sock = INVALID_SOCKET;
_handler = nil; _handler = nil;
_address.s.sa_family = AF_UNSPEC; _address.s.ss_family = AF_UNSPEC;
} }
return self; return self;
} }
- (struct sockaddr*) _address - (struct sockaddr_storage*) _address
{ {
return &_address.s; return &_address.s;
} }
@ -1577,7 +1577,7 @@ setNonBlocking(SOCKET fd)
{ {
id result = [super propertyForKey: key]; id result = [super propertyForKey: key];
if (result == nil && _address.s.sa_family != AF_UNSPEC) if (result == nil && _address.s.ss_family != AF_UNSPEC)
{ {
SOCKET s = [self _sock]; SOCKET s = [self _sock];
sockaddr_any sin; sockaddr_any sin;
@ -1693,7 +1693,7 @@ setNonBlocking(SOCKET fd)
} }
else else
{ {
[self _setAddress: (struct sockaddr*)&peer]; [self _setAddress: (struct sockaddr_storage*)&peer];
return YES; return YES;
} }
} }
@ -1715,7 +1715,7 @@ setNonBlocking(SOCKET fd)
else else
{ {
strncpy(peer.sun_path, c_addr, sizeof(peer.sun_path)-1); strncpy(peer.sun_path, c_addr, sizeof(peer.sun_path)-1);
[self _setAddress: (struct sockaddr*)&peer]; [self _setAddress: (struct sockaddr_storage*)&peer];
return YES; return YES;
} }
} }
@ -1726,7 +1726,7 @@ setNonBlocking(SOCKET fd)
} }
} }
- (void) _setAddress: (struct sockaddr*)address - (void) _setAddress: (struct sockaddr_storage*)address
{ {
memcpy(&_address.s, address, GSPrivateSockaddrLength(address)); memcpy(&_address.s, address, GSPrivateSockaddrLength(address));
} }
@ -1831,7 +1831,7 @@ setNonBlocking(SOCKET fd)
{ {
[GSSOCKS tryInput: self output: _sibling]; [GSSOCKS tryInput: self output: _sibling];
} }
s = socket(_address.s.sa_family, SOCK_STREAM, 0); s = socket(_address.s.ss_family, SOCK_STREAM, 0);
if (BADSOCKET(s)) if (BADSOCKET(s))
{ {
[self _recordError]; [self _recordError];
@ -1849,7 +1849,7 @@ setNonBlocking(SOCKET fd)
[GSTLSHandler tryInput: self output: _sibling]; [GSTLSHandler tryInput: self output: _sibling];
} }
result = connect([self _sock], &_address.s, result = connect([self _sock], (struct sockaddr*)&_address.s,
GSPrivateSockaddrLength(&_address.s)); GSPrivateSockaddrLength(&_address.s));
if (socketError(result)) if (socketError(result))
{ {
@ -2352,7 +2352,7 @@ setNonBlocking(SOCKET fd)
{ {
[GSSOCKS tryInput: _sibling output: self]; [GSSOCKS tryInput: _sibling output: self];
} }
s = socket(_address.s.sa_family, SOCK_STREAM, 0); s = socket(_address.s.ss_family, SOCK_STREAM, 0);
if (BADSOCKET(s)) if (BADSOCKET(s))
{ {
[self _recordError]; [self _recordError];
@ -2370,7 +2370,7 @@ setNonBlocking(SOCKET fd)
[GSTLSHandler tryInput: _sibling output: self]; [GSTLSHandler tryInput: _sibling output: self];
} }
result = connect([self _sock], &_address.s, result = connect([self _sock], (struct sockaddr*)&_address.s,
GSPrivateSockaddrLength(&_address.s)); GSPrivateSockaddrLength(&_address.s));
if (socketError(result)) if (socketError(result))
{ {
@ -2756,7 +2756,7 @@ setNonBlocking(SOCKET fd)
return; return;
} }
s = socket(_address.s.sa_family, SOCK_STREAM, 0); s = socket(_address.s.ss_family, SOCK_STREAM, 0);
if (BADSOCKET(s)) if (BADSOCKET(s))
{ {
[self _recordError]; [self _recordError];
@ -2769,9 +2769,9 @@ setNonBlocking(SOCKET fd)
} }
#ifndef BROKEN_SO_REUSEADDR #ifndef BROKEN_SO_REUSEADDR
if (_address.s.sa_family == AF_INET if (_address.s.ss_family == AF_INET
#ifdef AF_INET6 #ifdef AF_INET6
|| _address.s.sa_family == AF_INET6 || _address.s.ss_family == AF_INET6
#endif #endif
) )
{ {
@ -2792,7 +2792,7 @@ setNonBlocking(SOCKET fd)
#endif #endif
bindReturn = bind([self _sock], bindReturn = bind([self _sock],
&_address.s, GSPrivateSockaddrLength(&_address.s)); (struct sockaddr*)&_address.s, GSPrivateSockaddrLength(&_address.s));
if (socketError(bindReturn)) if (socketError(bindReturn))
{ {
[self _recordError]; [self _recordError];
@ -2854,11 +2854,11 @@ setNonBlocking(SOCKET fd)
struct { struct {
uint8_t bytes[BUFSIZ]; uint8_t bytes[BUFSIZ];
} __attribute__((aligned(2)))buf; } __attribute__((aligned(2)))buf;
struct sockaddr *addr = (struct sockaddr*)&buf; struct sockaddr_storage *addr = (struct sockaddr_storage*)&buf;
socklen_t len = sizeof(buf); socklen_t len = sizeof(buf);
int acceptReturn; int acceptReturn;
acceptReturn = accept([self _sock], addr, (OPTLEN*)&len); acceptReturn = accept([self _sock], (struct sockaddr*)addr, (OPTLEN*)&len);
_events &= ~NSStreamEventHasBytesAvailable; _events &= ~NSStreamEventHasBytesAvailable;
if (socketError(acceptReturn)) if (socketError(acceptReturn))
{ // test for real error { // test for real error

View file

@ -951,6 +951,15 @@
initToAddr: address port: port]); initToAddr: address port: port]);
sock = socket(PF_INET, SOCK_STREAM, 0); sock = socket(PF_INET, SOCK_STREAM, 0);
//IPv6
if(!ins)
{
#if defined(AF_INET6)
ins = (GSSocketStream*)AUTORELEASE([[GSInet6InputStream alloc] initToAddr: address port: port]);
outs = (GSSocketStream*)AUTORELEASE([[GSInet6OutputStream alloc] initToAddr: address port: port]);
#endif
}
/* /*
* Windows only permits a single event to be associated with a socket * Windows only permits a single event to be associated with a socket
* at any time, but the runloop system only allows an event handle to * at any time, but the runloop system only allows an event handle to