mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 00:41:02 +00:00
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:
parent
0282c8146e
commit
9b24a41871
2 changed files with 164 additions and 165 deletions
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue