mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-30 00:11:26 +00:00
Some tweaks for invocations and for networking.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@25140 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
1855046feb
commit
7c633ab823
6 changed files with 355 additions and 29 deletions
|
@ -42,6 +42,7 @@
|
|||
#include <Foundation/NSHost.h>
|
||||
#include <Foundation/NSProcessInfo.h>
|
||||
#include <Foundation/NSDebug.h>
|
||||
#include <Foundation/NSByteOrder.h>
|
||||
|
||||
#include "../GSStream.h"
|
||||
#include "../GSPrivate.h"
|
||||
|
@ -50,6 +51,47 @@
|
|||
|
||||
typedef int socklen_t;
|
||||
|
||||
static id propertyForInet4Stream(int descriptor, NSString *key)
|
||||
{
|
||||
struct sockaddr_in sin;
|
||||
unsigned size = sizeof(sin);
|
||||
id result = nil;
|
||||
|
||||
if ([key isEqualToString: GSStreamLocalAddressKey])
|
||||
{
|
||||
if (getsockname(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
result = [NSString stringWithUTF8String:
|
||||
(char*)inet_ntoa(sin.sin_addr)];
|
||||
}
|
||||
}
|
||||
else if ([key isEqualToString: GSStreamLocalPortKey])
|
||||
{
|
||||
if (getsockname(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
result = [NSString stringWithFormat: @"%d",
|
||||
(int)GSSwapBigI16ToHost(sin.sin_port)];
|
||||
}
|
||||
}
|
||||
else if ([key isEqualToString: GSStreamRemoteAddressKey])
|
||||
{
|
||||
if (getpeername(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
result = [NSString stringWithUTF8String:
|
||||
(char*)inet_ntoa(sin.sin_addr)];
|
||||
}
|
||||
}
|
||||
else if ([key isEqualToString: GSStreamRemotePortKey])
|
||||
{
|
||||
if (getpeername(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
result = [NSString stringWithFormat: @"%d",
|
||||
(int)GSSwapBigI16ToHost(sin.sin_port)];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* The concrete subclass of NSInputStream that reads from a file
|
||||
*/
|
||||
|
@ -1030,6 +1072,98 @@ static void setNonblocking(SOCKET fd)
|
|||
return self;
|
||||
}
|
||||
|
||||
static id propertyForInet4Stream(int descriptor, NSString *key)
|
||||
{
|
||||
struct sockaddr_in sin;
|
||||
unsigned size = sizeof(sin);
|
||||
id result = nil;
|
||||
|
||||
if ([key isEqualToString: GSStreamLocalAddressKey])
|
||||
{
|
||||
if (getsockname(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
result = [NSString stringWithUTF8String:
|
||||
(char*)inet_ntoa(sin.sin_addr)];
|
||||
}
|
||||
}
|
||||
else if ([key isEqualToString: GSStreamLocalPortKey])
|
||||
{
|
||||
if (getsockname(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
result = [NSString stringWithFormat: @"%d",
|
||||
(int)GSSwapBigI16ToHost(sin.sin_port)];
|
||||
}
|
||||
}
|
||||
else if ([key isEqualToString: GSStreamRemoteAddressKey])
|
||||
{
|
||||
if (getpeername(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
result = [NSString stringWithUTF8String:
|
||||
(char*)inet_ntoa(sin.sin_addr)];
|
||||
}
|
||||
}
|
||||
else if ([key isEqualToString: GSStreamRemotePortKey])
|
||||
{
|
||||
if (getpeername(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
result = [NSString stringWithFormat: @"%d",
|
||||
(int)GSSwapBigI16ToHost(sin.sin_port)];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
#if defined(AF_INET6)
|
||||
static id propertyForInet6Stream(int descriptor, NSString *key)
|
||||
{
|
||||
struct sockaddr_in6 sin;
|
||||
unsigned size = sizeof(sin);
|
||||
id result = nil;
|
||||
|
||||
if ([key isEqualToString: GSStreamLocalAddressKey])
|
||||
{
|
||||
if (getsockname(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
char buf[INET6_ADDRSTRLEN+1];
|
||||
|
||||
if (inet_ntop(AF_INET6, &(sin.sin6_addr), buf, INET6_ADDRSTRLEN) == 0)
|
||||
{
|
||||
buf[INET6_ADDRSTRLEN] = '\0';
|
||||
result = [NSString stringWithUTF8String: buf];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ([key isEqualToString: GSStreamLocalPortKey])
|
||||
{
|
||||
if (getsockname(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
result = [NSString stringWithFormat: @"%d",
|
||||
(int)GSSwapBigI16ToHost(sin.sin6_port)];
|
||||
}
|
||||
}
|
||||
else if ([key isEqualToString: GSStreamRemoteAddressKey])
|
||||
{
|
||||
if (getpeername(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
char buf[INET6_ADDRSTRLEN+1];
|
||||
|
||||
if (inet_ntop(AF_INET6, &(sin.sin6_addr), buf, INET6_ADDRSTRLEN) == 0)
|
||||
{
|
||||
buf[INET6_ADDRSTRLEN] = '\0';
|
||||
result = [NSString stringWithUTF8String: buf];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ([key isEqualToString: GSStreamRemotePortKey])
|
||||
{
|
||||
if (getpeername(descriptor, (struct sockaddr*)&sin, &size) != -1)
|
||||
{
|
||||
result = [NSString stringWithFormat: @"%d",
|
||||
(int)GSSwapBigI16ToHost(sin.sin6_port)];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
@end
|
||||
|
||||
@implementation GSFileOutputStream
|
||||
|
@ -1772,6 +1906,17 @@ static void setNonblocking(SOCKET fd)
|
|||
return self;
|
||||
}
|
||||
|
||||
- (id) propertyForKey: (NSString *)key
|
||||
{
|
||||
id result = propertyForInet4Stream((intptr_t)_loopID, key);
|
||||
|
||||
if (result == nil)
|
||||
{
|
||||
result = [super propertyForKey: key];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSStream
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue