mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-30 16:30:41 +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
a019a0480c
commit
ac2c5d6090
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.
|
// Key to info dictionary for operation mode.
|
||||||
static NSString* NotificationKey = @"NSFileHandleNotificationKey";
|
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)
|
@interface GSFileHandle(private)
|
||||||
- (void) receivedEventRead;
|
- (void) receivedEventRead;
|
||||||
- (void) receivedEventWrite;
|
- (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
|
/** The GSStreamHandler abstract class defines the methods used to
|
||||||
* implement a handler object for a pair of streams.
|
* implement a handler object for a pair of streams.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue