static void my_get_upnp_data(const struct sockaddr *sa) { #if !defined(NO_GETADDRINFO) char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; socklen_t salen; salen = (sa->sa_family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6); if (getnameinfo(sa, salen, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) { outerror(OUTERROR_TYPE_WARN_LOUD, "Invalid IP: %s", "upnp_router"); return; } #else /* NO_GETADDRINFO */ const struct sockaddr_in *remoteaddr = (const struct sockaddr_in *)sa; ir_uint32 to_ip; char hbuf[maxtextlengthshort], sbuf[maxtextlengthshort]; to_ip = ntohl(remoteaddr->sin_addr.s_addr); snprintf(hbuf, sizeof(hbuf), IPV4_PRINT_FMT, IPV4_PRINT_DATA(to_ip)); snprintf(sbuf, sizeof(sbuf), "%d", ntohs(remoteaddr->sin_port)); /* NOTRANSLATE */ #endif /* NO_GETADDRINFO */ if (sa->sa_family != AF_INET) return; updatecontext(); upnp_add_redir(hbuf, sbuf); }
// // BindToLocalPort // void BindToLocalPort (SOCKET s, u_short wanted) { int v; struct sockaddr_in address; memset (&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; u_short next = wanted; // denis - try several ports do { address.sin_port = htons(next++); v = bind (s, (sockaddr *)&address, sizeof(address)); if(next > wanted + 16) { I_FatalError ("BindToPort: error"); return; } }while (v == SOCKET_ERROR); char tmp[32] = ""; sprintf(tmp, "%d", next - 1); port.ForceSet(tmp); #ifdef ODA_HAVE_MINIUPNP std::string ip = NET_GetLocalAddress(); if (!ip.empty()) { sv_upnp_internalip.Set(ip.c_str()); Printf(PRINT_HIGH, "UPnP: Internal IP address is: %s\n", ip.c_str()); upnp_add_redir(ip.c_str(), next - 1); } else { Printf(PRINT_HIGH, "UPnP: Could not get first internal IP address, " "UPnP will not function\n"); is_upnp_ok = false; } #endif Printf(PRINT_HIGH, "Bound to local port %d\n", next - 1); }