]> git.tdb.fi Git - libs/net.git/blob - source/resolve.cpp
Style update: spaces around assignments
[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/strings/formatter.h>
8 #include "socket.h"
9 #include "resolve.h"
10
11 using namespace std;
12
13 namespace Msp {
14 namespace Net {
15
16 SockAddr *resolve(const string &s, Family family)
17 {
18         string host, serv;
19         if(s[0]=='[')
20         {
21                 unsigned bracket = s.find(']');
22                 host = s.substr(1, bracket-1);
23                 unsigned colon = s.find(':', bracket);
24                 if(colon!=string::npos)
25                         serv = s.substr(colon+1);
26         }
27         else
28         {
29                 unsigned colon = s.find(':');
30                 if(colon!=string::npos)
31                 {
32                         host = s.substr(0, colon);
33                         serv = s.substr(colon+1);
34                 }
35                 else
36                         host = s;
37         }
38
39         addrinfo hints = {0, family, 0, 0, 0, 0, 0, 0};
40         addrinfo *res;
41         const char *chost = (host.empty() ? 0 : host.c_str());
42         const char *cserv = (serv.empty() ? 0 : serv.c_str());
43         int err = getaddrinfo(chost, cserv, &hints, &res);
44         if(err==0)
45         {
46                 SockAddr *addr = SockAddr::create(*res->ai_addr);
47                 freeaddrinfo(res);
48                 return addr;
49         }
50         else
51 #ifdef WIN32
52                 throw Exception(format("Can't resolve '%s': %d", host, err));
53 #else
54                 throw Exception(format("Can't resolve '%s': %s", host, gai_strerror(err)));
55 #endif
56 }
57
58                 /*sockaddr sa;
59                 unsigned size = fill_sockaddr(sa);
60                 char hst[128];
61                 char srv[128];
62                 int err = getnameinfo(&sa, size, hst, 128, srv, 128, 0);
63                 if(err==0)
64                 {
65                         host = hst;
66                         serv = srv;
67                 }*/
68
69 } // namespace Net
70 } // namespace Msp