@@ -39,14 +39,10 @@ #import "socket.h" #import "socket_helpers.h" #import "resolver.h" -#ifdef __wii__ -static uint16_t freePort = 65532; -#endif - #ifdef OF_HAVE_THREADS @interface OFUDPSocket_ResolveThread: OFThread { OFThread *_sourceThread; OFString *_host; @@ -401,14 +397,27 @@ socklen_t addrLen; #endif #ifdef __wii__ if (port == 0) - port = freePort--; + port = of_socket_port_find(SOCK_DGRAM); + else if (!of_socket_port_register(port, SOCK_DGRAM)) + @throw [OFBindFailedException exceptionWithHost: host + port: port + socket: self + errNo: EADDRINUSE]; +#endif + + @try { + results = of_resolve_host(host, port, SOCK_DGRAM); + } @catch (id e) { +#ifdef __wii__ + of_socket_port_free(port, SOCK_DGRAM); #endif + @throw e; + } - results = of_resolve_host(host, port, SOCK_DGRAM); @try { #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) int flags; #endif @@ -436,16 +445,25 @@ @throw [OFBindFailedException exceptionWithHost: host port: port socket: self errNo: errNo]; } + } @catch (id e) { +#ifdef __wii__ + of_socket_port_free(port, SOCK_DGRAM); +#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) { @@ -605,7 +623,14 @@ if (_socket == INVALID_SOCKET) @throw [OFNotOpenException exceptionWithObject: self]; close(_socket); _socket = INVALID_SOCKET; + +#ifdef __wii__ + if (_port > 0) { + of_socket_port_free(_port, SOCK_DGRAM); + _port = 0; + } +#endif } @end