]> git.tdb.fi Git - libs/net.git/blob - source/resolve.cpp
Add back get_port functions to InetAddr and Inet6Addr
[libs/net.git] / source / resolve.cpp
1 #ifdef WIN32
2 #define _WIN32_WINNT 0x0501
3 #include <ws2tcpip.h>
4 #else
5 #include <netdb.h>
6 #endif
7 #include <msp/core/systemerror.h>
8 #include <msp/strings/format.h>
9 #include "sockaddr_private.h"
10 #include "socket.h"
11 #include "resolve.h"
12
13 using namespace std;
14
15 namespace Msp {
16 namespace Net {
17
18 SockAddr *resolve(const string &s, Family family)
19 {
20         string host, serv;
21         if(s[0]=='[')
22         {
23                 unsigned bracket = s.find(']');
24                 host = s.substr(1, bracket-1);
25                 unsigned colon = s.find(':', bracket);
26                 if(colon!=string::npos)
27                         serv = s.substr(colon+1);
28         }
29         else
30         {
31                 unsigned colon = s.find(':');
32                 if(colon!=string::npos)
33                 {
34                         host = s.substr(0, colon);
35                         serv = s.substr(colon+1);
36                 }
37                 else
38                         host = s;
39         }
40
41         unsigned flags = 0;
42         if(host=="*")
43         {
44                 flags = AI_PASSIVE;
45                 host = string();
46         }
47
48         addrinfo hints = { flags, family_to_sys(family), 0, 0, 0, 0, 0, 0 };
49         addrinfo *res;
50         const char *chost = (host.empty() ? 0 : host.c_str());
51         const char *cserv = (serv.empty() ? 0 : serv.c_str());
52         int err = getaddrinfo(chost, cserv, &hints, &res);
53         if(err==0)
54         {
55                 SockAddr::SysAddr sa;
56                 sa.size = res->ai_addrlen;
57                 const char *sptr = reinterpret_cast<const char *>(res->ai_addr);
58                 char *dptr = reinterpret_cast<char *>(&sa.addr);
59                 copy(sptr, sptr+res->ai_addrlen, dptr);
60                 SockAddr *addr = SockAddr::new_from_sys(sa);
61                 freeaddrinfo(res);
62                 return addr;
63         }
64         else
65 #ifdef WIN32
66                 throw system_error("getaddrinfo", WSAGetLastError());
67 #else
68                 throw system_error("getaddrinfo", gai_strerror(err));
69 #endif
70 }
71
72                 /*sockaddr sa;
73                 unsigned size = fill_sockaddr(sa);
74                 char hst[128];
75                 char srv[128];
76                 int err = getnameinfo(&sa, size, hst, 128, srv, 128, 0);
77                 if(err==0)
78                 {
79                         host = hst;
80                         serv = srv;
81                 }*/
82
83 } // namespace Net
84 } // namespace Msp