mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-30 16:30:41 +00:00
Merge pull request #307 from gnustep/Eggplant-Improved-IPv6-Support
Initial commit of updated IPv6
This commit is contained in:
commit
5912f4ed6f
4 changed files with 39 additions and 30 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue