X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fresolve.cpp;h=31b15fb9dd40ece09c09d2e25515bce25c2e00fd;hb=6102d830138013216241b6723527246764103fa0;hp=121b152b154c12d5e47867352ceae68d78e9ea63;hpb=f59eded7c3e162bbdfc6db424c9badc730017698;p=libs%2Fnet.git diff --git a/source/resolve.cpp b/source/resolve.cpp index 121b152..31b15fb 100644 --- a/source/resolve.cpp +++ b/source/resolve.cpp @@ -1,17 +1,11 @@ -/* $Id$ - -This file is part of libmspnet -Copyright © 2008 Mikkosoft Productions, Mikko Rasa -Distributed under the LGPL -*/ - #ifdef WIN32 #define _WIN32_WINNT 0x0501 #include #else #include #endif -#include +#include +#include #include "socket.h" #include "resolve.h" @@ -23,43 +17,54 @@ namespace Net { SockAddr *resolve(const string &s, Family family) { string host, serv; - unsigned colon=s.find(':'); - if(colon!=string::npos) + if(s[0]=='[') { - host=s.substr(0, colon); - serv=s.substr(colon+1); + 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 - host=s; + { + unsigned colon = s.find(':'); + if(colon!=string::npos) + { + host = s.substr(0, colon); + serv = s.substr(colon+1); + } + else + host = s; + } - addrinfo hints={0, family, 0, 0, 0, 0, 0, 0}; + addrinfo hints = {0, 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); + 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); if(err==0) { - SockAddr *addr=SockAddr::create(*res->ai_addr); + SockAddr *addr = SockAddr::create(*res->ai_addr); 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 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