X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fresolve.cpp;h=e8aad664d3cb5c722f032874352c60c15a5309e9;hb=21c596567e3b6fd794ed6af73d304ce2bc70e58f;hp=5bdf051b16ebc4892769a2541ed133a8941647ec;hpb=2aab4004e71a2e5c773289e0be5e58aec6a8d339;p=libs%2Fnet.git diff --git a/source/resolve.cpp b/source/resolve.cpp index 5bdf051..e8aad66 100644 --- a/source/resolve.cpp +++ b/source/resolve.cpp @@ -4,7 +4,9 @@ #else #include #endif -#include +#include +#include +#include "sockaddr_private.h" #include "socket.h" #include "resolve.h" @@ -13,57 +15,75 @@ using namespace std; namespace Msp { namespace Net { -SockAddr *resolve(const string &s, Family family) +SockAddr *resolve(const string &host, const string &serv, Family family) { - string host, serv; - if(s[0]=='[') + const char *chost = (host.empty() ? 0 : host.c_str()); + const char *cserv = (serv.empty() ? 0 : serv.c_str()); + unsigned flags = 0; + if(host=="*") { - unsigned bracket = s.find(']'); - host = s.substr(1, bracket-1); - unsigned colon = s.find(':', bracket); - if(colon!=string::npos) - serv = s.substr(colon+1); - } - else - { - unsigned colon = s.find(':'); - if(colon!=string::npos) - { - host = s.substr(0, colon); - serv = s.substr(colon+1); - } - else - host = s; + flags = AI_PASSIVE; + chost = 0; } - addrinfo hints={0, family, 0, 0, 0, 0, 0, 0}; + addrinfo hints = { flags, family_to_sys(family), 0, 0, 0, 0, 0, 0 }; addrinfo *res; - const char *chost=(host.empty() ? 0 : host.c_str()); - const char *cserv=(serv.empty() ? 0 : serv.c_str()); - int err=getaddrinfo(chost, cserv, &hints, &res); + + int err = getaddrinfo(chost, cserv, &hints, &res); if(err==0) { - SockAddr *addr=SockAddr::create(*res->ai_addr); + SockAddr::SysAddr sa; + sa.size = res->ai_addrlen; + const char *sptr = reinterpret_cast(res->ai_addr); + char *dptr = reinterpret_cast(&sa.addr); + copy(sptr, sptr+res->ai_addrlen, dptr); + SockAddr *addr = SockAddr::new_from_sys(sa); freeaddrinfo(res); return addr; } else #ifdef WIN32 - throw Exception(format("Can't resolve '%s': %d", host, err)); + throw system_error("getaddrinfo", WSAGetLastError()); #else - throw Exception(format("Can't resolve '%s': %s", host, gai_strerror(err))); + throw system_error("getaddrinfo", gai_strerror(err)); #endif } +SockAddr *resolve(const string &str, Family family) +{ + string host, serv; + if(str[0]=='[') + { + unsigned bracket = str.find(']'); + host = str.substr(1, bracket-1); + unsigned colon = str.find(':', bracket); + if(colon!=string::npos) + serv = str.substr(colon+1); + } + else + { + unsigned colon = str.find(':'); + if(colon!=string::npos) + { + host = str.substr(0, colon); + serv = str.substr(colon+1); + } + else + host = str; + } + + return resolve(host, serv, family); +} + /*sockaddr sa; - unsigned size=fill_sockaddr(sa); + unsigned size = fill_sockaddr(sa); char hst[128]; char srv[128]; - int err=getnameinfo(&sa, size, hst, 128, srv, 128, 0); + int err = getnameinfo(&sa, size, hst, 128, srv, 128, 0); if(err==0) { - host=hst; - serv=srv; + host = hst; + serv = srv; }*/ } // namespace Net