diff --git a/Source/GSFileHandle.m b/Source/GSFileHandle.m index b2366cbbf..8409349a4 100644 --- a/Source/GSFileHandle.m +++ b/Source/GSFileHandle.m @@ -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; diff --git a/Source/GSSocketStream.m b/Source/GSSocketStream.m index dc679bf73..a42a3a2d7 100644 --- a/Source/GSSocketStream.m +++ b/Source/GSSocketStream.m @@ -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.