@@ -61,14 +61,10 @@ 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; OFTCPSocket *_socket; @@ -237,10 +233,22 @@ @throw e; } return self; } + +- (void)close +{ + [super close]; + +#ifdef __wii__ + if (_port > 0) { + of_socket_port_free(_port, SOCK_STREAM); + _port = 0; + } +#endif +} - (void)dealloc { [_SOCKS5Host release]; @@ -399,14 +407,27 @@ @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; #ifdef __wii__ if (port == 0) - port = freePort--; + port = of_socket_port_find(SOCK_STREAM); + else if (!of_socket_port_register(port, SOCK_STREAM)) + @throw [OFBindFailedException exceptionWithHost: host + port: port + socket: self + errNo: EADDRINUSE]; +#endif + + @try { + results = of_resolve_host(host, port, SOCK_STREAM); + } @catch (id e) { +#ifdef __wii__ + of_socket_port_free(port, SOCK_STREAM); #endif + @throw e; + } - results = of_resolve_host(host, port, SOCK_STREAM); @try { #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) int flags; #endif @@ -437,16 +458,25 @@ @throw [OFBindFailedException exceptionWithHost: host port: port socket: self errNo: errNo]; } + } @catch (id e) { +#ifdef __wii__ + of_socket_port_free(port, SOCK_STREAM); +#endif + @throw e; } @finally { of_resolver_free(results); } - if (port > 0) + if (port > 0) { +#ifdef __wii__ + _port = port; +#endif return port; + } #ifndef __wii__ addrLen = (socklen_t)sizeof(addr.storage); if (of_getsockname(_socket, (struct sockaddr*)&addr.storage, &addrLen) != 0) {