]> git.tdb.fi Git - libs/net.git/blobdiff - source/net/resolve.cpp
Prepare for assimilating msphttp
[libs/net.git] / source / net / resolve.cpp
diff --git a/source/net/resolve.cpp b/source/net/resolve.cpp
new file mode 100644 (file)
index 0000000..e8aad66
--- /dev/null
@@ -0,0 +1,90 @@
+#ifdef WIN32
+#define _WIN32_WINNT 0x0501
+#include <ws2tcpip.h>
+#else
+#include <netdb.h>
+#endif
+#include <msp/core/systemerror.h>
+#include <msp/strings/format.h>
+#include "sockaddr_private.h"
+#include "socket.h"
+#include "resolve.h"
+
+using namespace std;
+
+namespace Msp {
+namespace Net {
+
+SockAddr *resolve(const string &host, const string &serv, Family family)
+{
+       const char *chost = (host.empty() ? 0 : host.c_str());
+       const char *cserv = (serv.empty() ? 0 : serv.c_str());
+       unsigned flags = 0;
+       if(host=="*")
+       {
+               flags = AI_PASSIVE;
+               chost = 0;
+       }
+
+       addrinfo hints = { flags, family_to_sys(family), 0, 0, 0, 0, 0, 0 };
+       addrinfo *res;
+
+       int err = getaddrinfo(chost, cserv, &hints, &res);
+       if(err==0)
+       {
+               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 system_error("getaddrinfo", WSAGetLastError());
+#else
+               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);
+               char hst[128];
+               char srv[128];
+               int err = getnameinfo(&sa, size, hst, 128, srv, 128, 0);
+               if(err==0)
+               {
+                       host = hst;
+                       serv = srv;
+               }*/
+
+} // namespace Net
+} // namespace Msp