#else
#include <netdb.h>
#endif
-#include <msp/strings/formatter.h>
+#include <msp/core/systemerror.h>
+#include <msp/strings/format.h>
+#include "sockaddr_private.h"
#include "socket.h"
#include "resolve.h"
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<const char *>(res->ai_addr);
+ char *dptr = reinterpret_cast<char *>(&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