Index: src/OFStreamObserver.m ================================================================== --- src/OFStreamObserver.m +++ src/OFStreamObserver.m @@ -60,11 +60,10 @@ #ifdef __wii__ # define BOOL OGC_BOOL # include # undef BOOL # define bind(sock, addr, addrlen) net_bind(sock, addr, addrlen) -# define getsockname(sock, addr, addrlen) net_getsockname(sock, addr, addrlen) # define sendto(sock, buf, len, flags, addr, addrlen) \ net_sendto(sock, buf, len, flags, addr, addrlen) # define socket(domain, type, proto) net_socket(domain, type, proto) #endif @@ -113,11 +112,13 @@ self = [super init]; @try { #ifndef OF_HAVE_PIPE struct sockaddr_in cancelAddr2; +# ifndef __wii__ socklen_t cancelAddrLen; +# endif #endif _readStreams = [[OFMutableArray alloc] init]; _writeStreams = [[OFMutableArray alloc] init]; _queue = [[OFMutableArray alloc] init]; @@ -143,22 +144,30 @@ _cancelAddr.sin_family = AF_INET; _cancelAddr.sin_port = 0; _cancelAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); cancelAddr2 = _cancelAddr; + +# ifdef __wii__ + /* The Wii does not accept port 0 as "choose any free port" */ + _cancelAddr.sin_port = 65533; + cancelAddr2.sin_port = 65534; +# endif if (bind(_cancelFD[0], (struct sockaddr*)&_cancelAddr, sizeof(_cancelAddr)) || bind(_cancelFD[1], (struct sockaddr*)&cancelAddr2, sizeof(cancelAddr2))) @throw [OFInitializationFailedException exceptionWithClass: [self class]]; +# ifndef __wii__ cancelAddrLen = sizeof(_cancelAddr); if (getsockname(_cancelFD[0], (struct sockaddr*)&_cancelAddr, &cancelAddrLen)) @throw [OFInitializationFailedException exceptionWithClass: [self class]]; +# endif #endif _maxFD = _cancelFD[0]; _FDToStream = [self allocMemoryWithSize: sizeof(OFStream*) count: _maxFD + 1]; Index: src/OFTCPSocket.m ================================================================== --- src/OFTCPSocket.m +++ src/OFTCPSocket.m @@ -90,16 +90,21 @@ # define accept(sock, addr, addrlen) net_accept(sock, addr, addrlen) # define bind(sock, addr, addrlen) net_bind(sock, addr, addrlen) # define close(sock) net_close(sock) # define connect(sock, addr, addrlen) net_connect(sock, addr, addrlen) # define gethostbyname(name) net_gethostbyname(name) -# define getsockname(sock, addr, addrlen) net_getsockname(sock, addr, addrlen) # define listen(sock, backlog) net_listen(sock, backlog) # define setsockopt(sock, level, name, value, len) \ net_setsockopt(sock, level, name, value, len) # define socket(domain, type, proto) net_socket(domain, type, proto) typedef u32 in_addr_t; + +struct sockaddr_storage { + u8 ss_len; + u8 ss_family; + u8 ss_data[14]; +}; #endif /* References for static linking */ void _references_to_categories_of_OFTCPSocket(void) { @@ -108,10 +113,14 @@ Class of_tls_socket_class = Nil; static OFString *defaultSOCKS5Host = nil; static uint16_t defaultSOCKS5Port = 1080; + +#ifdef __wii__ +static uint16_t freePort = 65532; +#endif #ifdef OF_HAVE_THREADS @interface OFTCPSocket_ConnectThread: OFThread { OFThread *_sourceThread; @@ -538,11 +547,13 @@ struct sockaddr_in in; #ifdef AF_INET6 struct sockaddr_in6 in6; #endif } addr; +#ifndef __wii__ socklen_t addrLen; +#endif if (_socket != INVALID_SOCKET) @throw [OFAlreadyConnectedException exceptionWithClass: [self class] socket: self]; @@ -549,10 +560,15 @@ if (_SOCKS5Host != nil) @throw [OFNotImplementedException exceptionWithClass: [self class] selector: _cmd]; + +#ifdef __wii__ + if (port == 0) + port = freePort--; +#endif #ifdef HAVE_THREADSAFE_GETADDRINFO struct addrinfo hints, *res; char portCString[7]; @@ -653,10 +669,11 @@ #endif if (port > 0) return port; +#ifndef __wii__ addrLen = sizeof(addr.storage); if (getsockname(_socket, (struct sockaddr*)&addr, &addrLen)) { close(_socket); _socket = INVALID_SOCKET; @throw [OFBindFailedException exceptionWithClass: [self class] @@ -665,13 +682,14 @@ port: port]; } if (addr.storage.ss_family == AF_INET) return OF_BSWAP16_IF_LE(addr.in.sin_port); -#ifdef AF_INET6 +# ifdef AF_INET6 if (addr.storage.ss_family == AF_INET6) return OF_BSWAP16_IF_LE(addr.in6.sin6_port); +# endif #endif close(_socket); _socket = INVALID_SOCKET; @throw [OFBindFailedException exceptionWithClass: [self class]