-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathutils.cpp
109 lines (90 loc) · 2.76 KB
/
utils.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "mdns_cpp/utils.hpp"
#ifdef _WIN32
#define _CRT_SECURE_NO_WARNINGS 1
#endif
#include <errno.h>
#include <stdio.h>
#include <iostream>
#include <stdexcept>
#ifdef _WIN32
#include <Ws2tcpip.h>
#include <iphlpapi.h>
#include <windows.h>
#include <winsock.h>
#else
#include <ifaddrs.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#endif
#include "mdns_cpp/macros.hpp"
namespace mdns_cpp {
std::string getHostName() {
const char *hostname = "dummy-host";
#ifdef _WIN32
WORD versionWanted = MAKEWORD(1, 1);
WSADATA wsaData;
if (WSAStartup(versionWanted, &wsaData)) {
const auto msg = "Error: Failed to initialize WinSock";
MDNS_LOG << msg << "\n";
throw std::runtime_error(msg);
}
char hostname_buffer[256];
DWORD hostname_size = (DWORD)sizeof(hostname_buffer);
if (GetComputerNameA(hostname_buffer, &hostname_size)) {
hostname = hostname_buffer;
}
#else
char hostname_buffer[256];
const size_t hostname_size = sizeof(hostname_buffer);
if (gethostname(hostname_buffer, hostname_size) == 0) {
hostname = hostname_buffer;
}
#endif
return hostname;
}
std::string ipv4AddressToString(char *buffer, size_t capacity, const sockaddr_in *addr, size_t addrlen) {
char host[NI_MAXHOST] = {0};
char service[NI_MAXSERV] = {0};
const int ret = getnameinfo((const struct sockaddr *)addr, (socklen_t)addrlen, host, NI_MAXHOST, service, NI_MAXSERV,
NI_NUMERICSERV | NI_NUMERICHOST);
int len = 0;
if (ret == 0) {
if (addr->sin_port != 0) {
len = snprintf(buffer, capacity, "%s:%s", host, service);
} else {
len = snprintf(buffer, capacity, "%s", host);
}
}
if (len >= (int)capacity) {
len = (int)capacity - 1;
}
return std::string(buffer, len);
}
std::string ipv6AddressToString(char *buffer, size_t capacity, const sockaddr_in6 *addr, size_t addrlen) {
char host[NI_MAXHOST] = {0};
char service[NI_MAXSERV] = {0};
const int ret = getnameinfo((const struct sockaddr *)addr, (socklen_t)addrlen, host, NI_MAXHOST, service, NI_MAXSERV,
NI_NUMERICSERV | NI_NUMERICHOST);
int len = 0;
if (ret == 0) {
if (addr->sin6_port != 0) {
{
len = snprintf(buffer, capacity, "[%s]:%s", host, service);
}
} else {
len = snprintf(buffer, capacity, "%s", host);
}
}
if (len >= (int)capacity) {
len = (int)capacity - 1;
}
return std::string(buffer, len);
}
std::string ipAddressToString(char *buffer, size_t capacity, const sockaddr *addr, size_t addrlen) {
if (addr->sa_family == AF_INET6) {
return ipv6AddressToString(buffer, capacity, (const struct sockaddr_in6 *)addr, addrlen);
}
return ipv4AddressToString(buffer, capacity, (const struct sockaddr_in *)addr, addrlen);
}
} // namespace mdns_cpp