13 #ifndef __STOUT_WINDOWS_NET_HPP__
14 #define __STOUT_WINDOWS_NET_HPP__
34 struct addrinfoW addr;
35 memset(&addr, 0,
sizeof(addr));
36 addr.ai_socktype = socktype;
37 addr.ai_family = family;
38 addr.ai_flags |=
flags;
57 struct sockaddr_storage storage;
58 memset(&storage, 0,
sizeof(storage));
60 switch (ip.family()) {
62 struct sockaddr_in addr;
63 memset(&addr, 0,
sizeof(addr));
64 addr.sin_family = AF_INET;
65 addr.sin_addr = ip.in().get();
68 memcpy(&storage, &addr,
sizeof(addr));
72 struct sockaddr_in6 addr;
73 memset(&addr, 0,
sizeof(addr));
74 addr.sin6_family = AF_INET6;
75 addr.sin6_addr = ip.in6().get();
78 memcpy(&storage, &addr,
sizeof(addr));
89 if (ip.family() == AF_INET) {
90 length =
sizeof(
struct sockaddr_in);
91 }
else if (ip.family() == AF_INET6) {
92 length =
sizeof(
struct sockaddr_in6);
97 int error = GetNameInfoW(
98 (
struct sockaddr*) &storage,
110 return stringify(std::wstring(hostname));
116 inline Try<IP> getIP(
const std::string& hostname,
int family = AF_UNSPEC)
119 struct addrinfoW* result =
nullptr;
122 GetAddrInfoW(wide_stringify(hostname).data(),
nullptr, &hints, &result);
128 if (result->ai_addr ==
nullptr) {
129 FreeAddrInfoW(result);
130 return Error(
"No addresses found");
136 FreeAddrInfoW(result);
137 return Error(
"Unsupported family type");
140 FreeAddrInfoW(result);
158 if (GetAdaptersInfo(
nullptr, &size) != ERROR_BUFFER_OVERFLOW) {
159 return WindowsError(
"Calling GetAdaptersInfo returned unexpected result");
162 std::set<std::string> names;
163 std::vector<IP_ADAPTER_INFO> adapter_info(size /
sizeof(IP_ADAPTER_INFO));
164 result = GetAdaptersInfo(
165 static_cast<PIP_ADAPTER_INFO>(adapter_info.data()),
168 if (result != NO_ERROR) {
172 foreach (
const IP_ADAPTER_INFO& ip_adapter, adapter_info) {
173 names.insert(ip_adapter.AdapterName);
189 if (::SetComputerNameW(wide_stringify(hostname).data()) == 0) {
198 #endif // __STOUT_WINDOWS_NET_HPP__
Try< Nothing > setHostname(const std::string &hostname)
Definition: net.hpp:179
Definition: nothing.hpp:16
Definition: errorbase.hpp:35
#define ABORT(...)
Definition: abort.hpp:40
Try< Bytes > size(const std::string &path, const FollowSymlink follow=FollowSymlink::FOLLOW_SYMLINK)
Definition: stat.hpp:100
Definition: error.hpp:106
Try< std::string > getHostname(const IP &ip)
Definition: net.hpp:45
#define MAXHOSTNAMELEN
Definition: windows.hpp:168
Try< std::string > nodename()
Definition: os.hpp:58
Try< std::set< std::string > > links()
Definition: net.hpp:135
struct addrinfo createAddrInfo(int socktype, int family, int flags)
Definition: net.hpp:28
Try< std::string > hostname()
Definition: net.hpp:154
#define flags
Definition: decoder.hpp:18
Error GaiError(int error)
Definition: net.hpp:44
bool isError() const
Definition: try.hpp:71
std::string error(const std::string &msg, uint32_t code)
Try< IP > getIP(const std::string &hostname, int family=AF_UNSPEC)
Definition: net.hpp:106
std::string stringify(int flags)
static Try< IP > create(const struct sockaddr_storage &_storage)
Definition: ip.hpp:454
const T & get() const
Definition: try.hpp:73