build new private functions on win32

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@33975 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 2011-10-12 16:31:30 +00:00
parent 0282c8146e
commit 9b24a41871
2 changed files with 164 additions and 165 deletions

View file

@ -98,171 +98,6 @@ static GSFileHandle* fh_stderr = nil;
// Key to info dictionary for operation mode.
static NSString* NotificationKey = @"NSFileHandleNotificationKey";
NSString *
GSPrivateSockaddrHost(struct sockaddr *addr)
{
char buf[40];
#if defined(AF_INET6)
if (AF_INET6 == addr->sa_family)
{
struct sockaddr_in6 *addr6 = (struct sockaddr_in6*)addr;
inet_ntop(AF_INET, &addr6->sin6_addr, buf, sizeof(buf));
return [NSString stringWithUTF8String: buf];
}
#endif
inet_ntop(AF_INET, &((struct sockaddr_in*)addr)->sin_addr, buf, sizeof(buf));
return [NSString stringWithUTF8String: buf];
}
NSString *
GSPrivateSockaddrName(struct sockaddr *addr)
{
return [NSString stringWithFormat: @"%@:%d",
GSPrivateSockaddrHost(addr),
GSPrivateSockaddrPort(addr)];
}
uint16_t
GSPrivateSockaddrPort(struct sockaddr *addr)
{
uint16_t port;
#if defined(AF_INET6)
if (AF_INET6 == addr->sa_family)
{
struct sockaddr_in6 *addr6 = (struct sockaddr_in6*)addr;
port = addr6->sin6_port;
port = GSSwapBigI16ToHost(port);
return port;
}
#endif
port = ((struct sockaddr_in*)addr)->sin_port;
port = GSSwapBigI16ToHost(port);
return port;
}
BOOL
GSPrivateSockaddrSetup(NSString *machine, uint16_t port,
NSString *service, NSString *protocol, struct sockaddr *sin)
{
memset(sin, '\0', sizeof(*sin));
sin->sa_family = AF_INET;
/* If we were given a hostname, we use any address for that host.
* Otherwise we expect the given name to be an address unless it is
* a null (any address).
*/
if (0 != [machine length])
{
const char *n;
n = [machine UTF8String];
if ((!isdigit(n[0]) || sscanf(n, "%*d.%*d.%*d.%*d") != 4)
&& 0 == strchr(n, ':'))
{
machine = [[NSHost hostWithName: machine] address];
n = [machine UTF8String];
}
if (0 == strchr(n, ':'))
{
struct sockaddr_in *addr = (struct sockaddr_in*)sin;
if (inet_pton(AF_INET, n, &addr->sin_addr) <= 0)
{
return NO;
}
}
else
{
#if defined(AF_INET6)
struct sockaddr_in6 *addr6 = (struct sockaddr_in6*)sin;
sin->sa_family = AF_INET6;
if (inet_pton(AF_INET6, n, &addr6->sin6_addr) <= 0)
{
return NO;
}
#else
return NO;
#endif
}
}
else
{
((struct sockaddr_in*)sin)->sin_addr.s_addr
= GSSwapHostI32ToBig(INADDR_ANY);
}
/* The optional service and protocol parameters may be used to
* look up the port
*/
if (nil != service)
{
const char *sname;
const char *proto;
struct servent *sp;
if (nil == protocol)
{
proto = "tcp";
}
else
{
proto = [protocol UTF8String];
}
sname = [service UTF8String];
if ((sp = getservbyname(sname, proto)) == 0)
{
const char* ptr = sname;
int val = atoi(ptr);
while (isdigit(*ptr))
{
ptr++;
}
if (*ptr == '\0' && val <= 0xffff)
{
port = val;
}
else if (strcmp(ptr, "gdomap") == 0)
{
#ifdef GDOMAP_PORT_OVERRIDE
port = GDOMAP_PORT_OVERRIDE;
#else
port = 538; // IANA allocated port
#endif
}
else
{
return NO;
}
}
else
{
port = GSSwapBigI16ToHost(sp->s_port);
}
}
#if defined(AF_INET6)
if (AF_INET6 == sin->sa_family)
{
((struct sockaddr_in6*)sin)->sin6_port = GSSwapHostI16ToBig(port);
}
else
{
((struct sockaddr_in*)sin)->sin_port = GSSwapHostI16ToBig(port);
}
#else
((struct sockaddr_ind*)sin)->sin6_port = GSSwapHostI16ToBig(port);
#endif
return YES;
}
@interface GSFileHandle(private)
- (void) receivedEventRead;
- (void) receivedEventWrite;

View file

@ -72,6 +72,170 @@ GSPrivateSockaddrLength(struct sockaddr *addr)
}
}
NSString *
GSPrivateSockaddrHost(struct sockaddr *addr)
{
char buf[40];
#if defined(AF_INET6)
if (AF_INET6 == addr->sa_family)
{
struct sockaddr_in6 *addr6 = (struct sockaddr_in6*)addr;
inet_ntop(AF_INET, &addr6->sin6_addr, buf, sizeof(buf));
return [NSString stringWithUTF8String: buf];
}
#endif
inet_ntop(AF_INET, &((struct sockaddr_in*)addr)->sin_addr, buf, sizeof(buf));
return [NSString stringWithUTF8String: buf];
}
NSString *
GSPrivateSockaddrName(struct sockaddr *addr)
{
return [NSString stringWithFormat: @"%@:%d",
GSPrivateSockaddrHost(addr),
GSPrivateSockaddrPort(addr)];
}
uint16_t
GSPrivateSockaddrPort(struct sockaddr *addr)
{
uint16_t port;
#if defined(AF_INET6)
if (AF_INET6 == addr->sa_family)
{
struct sockaddr_in6 *addr6 = (struct sockaddr_in6*)addr;
port = addr6->sin6_port;
port = GSSwapBigI16ToHost(port);
return port;
}
#endif
port = ((struct sockaddr_in*)addr)->sin_port;
port = GSSwapBigI16ToHost(port);
return port;
}
BOOL
GSPrivateSockaddrSetup(NSString *machine, uint16_t port,
NSString *service, NSString *protocol, struct sockaddr *sin)
{
memset(sin, '\0', sizeof(*sin));
sin->sa_family = AF_INET;
/* If we were given a hostname, we use any address for that host.
* Otherwise we expect the given name to be an address unless it is
* a null (any address).
*/
if (0 != [machine length])
{
const char *n;
n = [machine UTF8String];
if ((!isdigit(n[0]) || sscanf(n, "%*d.%*d.%*d.%*d") != 4)
&& 0 == strchr(n, ':'))
{
machine = [[NSHost hostWithName: machine] address];
n = [machine UTF8String];
}
if (0 == strchr(n, ':'))
{
struct sockaddr_in *addr = (struct sockaddr_in*)sin;
if (inet_pton(AF_INET, n, &addr->sin_addr) <= 0)
{
return NO;
}
}
else
{
#if defined(AF_INET6)
struct sockaddr_in6 *addr6 = (struct sockaddr_in6*)sin;
sin->sa_family = AF_INET6;
if (inet_pton(AF_INET6, n, &addr6->sin6_addr) <= 0)
{
return NO;
}
#else
return NO;
#endif
}
}
else
{
((struct sockaddr_in*)sin)->sin_addr.s_addr
= GSSwapHostI32ToBig(INADDR_ANY);
}
/* The optional service and protocol parameters may be used to
* look up the port
*/
if (nil != service)
{
const char *sname;
const char *proto;
struct servent *sp;
if (nil == protocol)
{
proto = "tcp";
}
else
{
proto = [protocol UTF8String];
}
sname = [service UTF8String];
if ((sp = getservbyname(sname, proto)) == 0)
{
const char* ptr = sname;
int val = atoi(ptr);
while (isdigit(*ptr))
{
ptr++;
}
if (*ptr == '\0' && val <= 0xffff)
{
port = val;
}
else if (strcmp(ptr, "gdomap") == 0)
{
#ifdef GDOMAP_PORT_OVERRIDE
port = GDOMAP_PORT_OVERRIDE;
#else
port = 538; // IANA allocated port
#endif
}
else
{
return NO;
}
}
else
{
port = GSSwapBigI16ToHost(sp->s_port);
}
}
#if defined(AF_INET6)
if (AF_INET6 == sin->sa_family)
{
((struct sockaddr_in6*)sin)->sin6_port = GSSwapHostI16ToBig(port);
}
else
{
((struct sockaddr_in*)sin)->sin_port = GSSwapHostI16ToBig(port);
}
#else
((struct sockaddr_ind*)sin)->sin6_port = GSSwapHostI16ToBig(port);
#endif
return YES;
}
/** The GSStreamHandler abstract class defines the methods used to
* implement a handler object for a pair of streams.