Big code refactoring #10
@ -186,10 +186,10 @@ void wgKeys::generatePreshared(wg_key preshared_key) {
|
||||
size_t ret, i;
|
||||
int fd;
|
||||
fd = open("/dev/urandom", O_RDONLY);
|
||||
assert(fd >= 0);
|
||||
if (fd <= 0);
|
||||
for (i = 0; i < sizeof(wg_key); i += ret) {
|
||||
ret = read(fd, preshared_key + i, sizeof(wg_key) - i);
|
||||
assert(ret > 0);
|
||||
if (ret < 0);
|
||||
}
|
||||
close(fd);
|
||||
return;
|
||||
|
@ -0,0 +1,275 @@
|
||||
#include "wginterface.hh"
|
||||
#include "genKey/wgkeys.hh"
|
||||
extern "C" {
|
||||
#include "wireguard.h"
|
||||
}
|
||||
#include <string>
|
||||
#include <ifaddrs.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
std::string getWireguardVersion() {
|
||||
return "Kernel";
|
||||
}
|
||||
|
||||
void WireguardDevices::getInterfaces() {
|
||||
size_t len; char *device_name, *devicesList = wg_list_device_names();
|
||||
|
||||
if (!devicesList) throw std::string("Unable to get device names");
|
||||
|
||||
// Clear list
|
||||
this->clear();
|
||||
|
||||
// Set new devices
|
||||
for (device_name = devicesList, len = 0; (len = strlen(device_name)); device_name += len + 1) this->push_back(std::string(device_name));
|
||||
|
||||
// Free memory
|
||||
free(devicesList);
|
||||
}
|
||||
|
||||
void WireguardDevices::deleteInterface(std::string wgName) {
|
||||
// Check if exist, if not skip
|
||||
if (this->exist(wgName)) {
|
||||
int status = wg_del_device(wgName.c_str());
|
||||
if (status < 0) throw std::string("Cannot delete interface, code: ").append(std::to_string(status));
|
||||
}
|
||||
}
|
||||
|
||||
void WireguardConfig::getWireguardConfig() {
|
||||
if (this->name.length() == 0) throw std::string("Set wireguard name!");
|
||||
else if (this->name.length() > IFNAMSIZ) throw std::string("Wireguard interface name is long, max name length is ").append(std::to_string(IFNAMSIZ));
|
||||
else if (!(WireguardDevices().exist(this->name))) throw std::string("Wireguard interface not exist");
|
||||
int status; wg_device *devConfig; wg_peer *peer;
|
||||
if ((status = wg_get_device(&devConfig, this->name.c_str())) < 0) throw std::string("It was not possible to get the Wireguard interface settings, code: ").append(std::to_string(status));
|
||||
if (devConfig->flags & WGDEVICE_HAS_PRIVATE_KEY) privateKey = wgKeys::toString(devConfig->private_key);
|
||||
if (devConfig->flags & WGDEVICE_HAS_PUBLIC_KEY) publicKey = wgKeys::toString(devConfig->public_key);
|
||||
if (devConfig->flags & WGDEVICE_HAS_LISTEN_PORT) portListen = devConfig->listen_port;
|
||||
|
||||
auto HostAdresses = [](bool addPort, const sockaddr* addr) -> std::string {
|
||||
char host[4096 + 1], service[512 + 1];
|
||||
static char buf[sizeof(host) + sizeof(service) + 4];
|
||||
memset(buf, 0, sizeof(buf));
|
||||
int ret;
|
||||
socklen_t addr_len = 0;
|
||||
if (addr->sa_family == AF_INET) addr_len = sizeof(struct sockaddr_in);
|
||||
else if (addr->sa_family == AF_INET6) addr_len = sizeof(struct sockaddr_in6);
|
||||
|
||||
ret = getnameinfo(addr, addr_len, host, sizeof(host), service, sizeof(service), NI_DGRAM | NI_NUMERICSERV | NI_NUMERICHOST);
|
||||
if (ret) {
|
||||
strncpy(buf, gai_strerror(ret), sizeof(buf) - 1);
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
} else {
|
||||
if (addPort) snprintf(buf, sizeof(buf), (addr->sa_family == AF_INET6 && strchr(host, ':')) ? "[%s]:%s" : "%s:%s", host, service);
|
||||
else snprintf(buf, sizeof(buf), "%s", host);
|
||||
}
|
||||
return std::string(buf);
|
||||
};
|
||||
|
||||
ifaddrs* ptr_ifaddrs = nullptr;
|
||||
if(getifaddrs(&ptr_ifaddrs) > 0) {
|
||||
for (ifaddrs* ptr_entry = ptr_ifaddrs; ptr_entry != nullptr; ptr_entry = ptr_entry->ifa_next) {
|
||||
if (ptr_entry->ifa_addr == nullptr) continue;
|
||||
else if (strcmp(ptr_entry->ifa_name, this->name.c_str()) != 0) continue;
|
||||
else if (ptr_entry->ifa_addr->sa_family == AF_INET) this->interfaceAddress.addIPMask(HostAdresses(false, ptr_entry->ifa_addr));
|
||||
else if (ptr_entry->ifa_addr->sa_family == AF_INET6) this->interfaceAddress.addIPMask(HostAdresses(false, ptr_entry->ifa_addr));
|
||||
}
|
||||
freeifaddrs(ptr_ifaddrs);
|
||||
}
|
||||
|
||||
for ((peer) = (devConfig)->first_peer; (peer); (peer) = (peer)->next_peer) {
|
||||
auto PeerConfig = Peer();
|
||||
if (peer->flags & WGPEER_HAS_PRESHARED_KEY) PeerConfig.presharedKey = wgKeys::toString(peer->preshared_key);
|
||||
if (peer->flags & WGPEER_HAS_PERSISTENT_KEEPALIVE_INTERVAL) PeerConfig.keepInterval = peer->persistent_keepalive_interval;
|
||||
if (peer->endpoint.addr.sa_family == AF_INET||peer->endpoint.addr.sa_family == AF_INET6) PeerConfig.endpoint = HostAdresses(true, &peer->endpoint.addr);
|
||||
|
||||
PeerConfig.lastHandshake = peer->last_handshake_time.tv_sec*1000;
|
||||
PeerConfig.rxBytes = peer->rx_bytes;
|
||||
PeerConfig.txBytes = peer->tx_bytes;
|
||||
|
||||
if (peer->first_allowedip) {
|
||||
wg_allowedip *allowedip;
|
||||
for ((allowedip) = (peer)->first_allowedip; (allowedip); (allowedip) = (allowedip)->next_allowedip) {
|
||||
static char buf[INET6_ADDRSTRLEN + 1];
|
||||
memset(buf, 0, INET6_ADDRSTRLEN + 1);
|
||||
if (allowedip->family == AF_INET) inet_ntop(AF_INET, &allowedip->ip4, buf, INET6_ADDRSTRLEN);
|
||||
else if (allowedip->family == AF_INET6) inet_ntop(AF_INET6, &allowedip->ip6, buf, INET6_ADDRSTRLEN);
|
||||
PeerConfig.allowedIPs.push_back(std::string(buf).append("/").append(std::to_string(allowedip->cidr)));
|
||||
}
|
||||
}
|
||||
this->Peers[wgKeys::toString(peer->public_key)] = PeerConfig;
|
||||
}
|
||||
}
|
||||
|
||||
void WireguardConfig::setWireguardConfig() {
|
||||
int status;
|
||||
if (this->name.length() == 0) throw std::string("Set wireguard name!");
|
||||
else if (this->name.length() > IFNAMSIZ) throw std::string("Wireguard interface name is long, max name length is ").append(std::to_string(IFNAMSIZ));
|
||||
else if (!(WireguardDevices().exist(this->name)) && (status = wg_add_device(this->name.c_str())) < 0) throw std::string("Unable to create Wireguard interface, code: ").append(std::to_string(status));
|
||||
if (this->privateKey.length() != Base64WgKeyLength) throw std::string("Set Wireguard interface private key!");
|
||||
|
||||
auto wgConfig = (wg_device*)malloc(sizeof(wg_device));
|
||||
if (!wgConfig) throw std::string("Cannot alloc memory to set interface configuration!");
|
||||
strncpy(wgConfig->name, this->name.c_str(), this->name.length());
|
||||
|
||||
wgConfig->flags = wg_device_flags::WGDEVICE_HAS_PRIVATE_KEY;
|
||||
wgKeys::stringToKey(wgConfig->private_key, this->privateKey);
|
||||
|
||||
if (this->replacePeers) wgConfig->flags = (wg_device_flags)(wgConfig->flags|wg_device_flags::WGDEVICE_REPLACE_PEERS);
|
||||
|
||||
if (this->publicKey.length() == Base64WgKeyLength) {
|
||||
wgConfig->flags = (wg_device_flags)(wgConfig->flags|wg_device_flags::WGDEVICE_HAS_PUBLIC_KEY);
|
||||
wgKeys::stringToKey(wgConfig->public_key, this->publicKey);
|
||||
}
|
||||
|
||||
if (this->portListen >= 0) {
|
||||
wgConfig->flags = (wg_device_flags)(wgConfig->flags|wg_device_flags::WGDEVICE_HAS_LISTEN_PORT);
|
||||
wgConfig->listen_port = this->portListen;
|
||||
}
|
||||
|
||||
if (this->fwmark >= 0) {
|
||||
wgConfig->flags = (wg_device_flags)(wgConfig->flags|wg_device_flags::WGDEVICE_HAS_FWMARK);
|
||||
wgConfig->fwmark = this->fwmark;
|
||||
}
|
||||
|
||||
for (auto &PeerConfig : this->Peers) {
|
||||
wg_peer* peer;
|
||||
peer = (wg_peer*)malloc(sizeof(wg_peer));
|
||||
peer->flags = wg_peer_flags::WGPEER_HAS_PUBLIC_KEY;
|
||||
wgKeys::stringToKey(peer->public_key, PeerConfig.first);
|
||||
if (PeerConfig.second.removeMe) peer->flags = (wg_peer_flags)(peer->flags|wg_peer_flags::WGPEER_REMOVE_ME);
|
||||
else {
|
||||
if (PeerConfig.second.presharedKey.length() == Base64WgKeyLength) {
|
||||
peer->flags = (wg_peer_flags)(peer->flags|wg_peer_flags::WGPEER_HAS_PRESHARED_KEY);
|
||||
wgKeys::stringToKey(peer->preshared_key, PeerConfig.second.presharedKey);
|
||||
}
|
||||
|
||||
if (PeerConfig.second.keepInterval > 0) {
|
||||
peer->flags = (wg_peer_flags)(peer->flags|wg_peer_flags::WGPEER_HAS_PERSISTENT_KEEPALIVE_INTERVAL);
|
||||
peer->persistent_keepalive_interval = PeerConfig.second.keepInterval;
|
||||
}
|
||||
|
||||
if (PeerConfig.second.endpoint.length() > 0) {
|
||||
sockaddr endpoint; int ret, retries;
|
||||
char *begin, *end, *Endpoint = strdup(PeerConfig.second.endpoint.c_str());
|
||||
if (Endpoint[0] == '[') {
|
||||
begin = &Endpoint[1];
|
||||
end = strchr(Endpoint, ']');
|
||||
if (!end) {
|
||||
for ((peer) = (wgConfig)->first_peer; (peer); (peer) = (peer)->next_peer) { free(peer); }
|
||||
free(wgConfig);
|
||||
free(Endpoint);
|
||||
throw std::string("Unable to find matching brace of endpoint");
|
||||
return;
|
||||
}
|
||||
*end++ = '\0';
|
||||
if (*end++ != ':' || !*end) {
|
||||
for ((peer) = (wgConfig)->first_peer; (peer); (peer) = (peer)->next_peer) { free(peer); }
|
||||
free(wgConfig);
|
||||
free(Endpoint);
|
||||
throw std::string("Unable to find port of endpoint");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
begin = Endpoint;
|
||||
end = strrchr(Endpoint, ':');
|
||||
if (!end || !*(end + 1)) {
|
||||
for ((peer) = (wgConfig)->first_peer; (peer); (peer) = (peer)->next_peer) { free(peer); }
|
||||
free(wgConfig);
|
||||
free(Endpoint);
|
||||
throw std::string("Unable to find port of endpoint");
|
||||
}
|
||||
*end++ = '\0';
|
||||
}
|
||||
addrinfo *resolved, hints = { ai_family: AF_UNSPEC, ai_socktype: SOCK_DGRAM, ai_protocol: IPPROTO_UDP };
|
||||
for (unsigned int timeout = 1000000;; timeout = ((20000000) < (timeout * 6 / 5) ? (20000000) : (timeout * 6 / 5))) {
|
||||
ret = getaddrinfo(begin, end, &hints, &resolved);
|
||||
if (!ret) break;
|
||||
if (ret == EAI_NONAME || ret == EAI_FAIL ||
|
||||
#ifdef EAI_NODATA
|
||||
ret == EAI_NODATA ||
|
||||
#endif
|
||||
(retries >= 0 && !retries--)) {
|
||||
for ((peer) = (wgConfig)->first_peer; (peer); (peer) = (peer)->next_peer) { free(peer); }
|
||||
free(wgConfig);
|
||||
free(Endpoint);
|
||||
fprintf(stderr, "%s: `%s'\n", ret == EAI_SYSTEM ? strerror(errno) : gai_strerror(ret), PeerConfig.second.endpoint.c_str());
|
||||
throw std::string("Unable to resolve endpoint");
|
||||
return;
|
||||
}
|
||||
fprintf(stderr, "%s: `%s'. Trying again in %.2f seconds...\n", ret == EAI_SYSTEM ? strerror(errno) : gai_strerror(ret), PeerConfig.second.endpoint.c_str(), timeout / 1000000.0);
|
||||
usleep(timeout);
|
||||
}
|
||||
if ((resolved->ai_family == AF_INET && resolved->ai_addrlen == sizeof(sockaddr_in)) || (resolved->ai_family == AF_INET6 && resolved->ai_addrlen == sizeof(sockaddr_in6))) {
|
||||
memcpy(&endpoint, resolved->ai_addr, resolved->ai_addrlen);
|
||||
memccpy(&peer->endpoint.addr, &endpoint, 0, sizeof(peer->endpoint.addr));
|
||||
if (resolved->ai_family == AF_INET) {
|
||||
peer->endpoint.addr4.sin_addr.s_addr = ((sockaddr_in *)&endpoint)->sin_addr.s_addr;
|
||||
peer->endpoint.addr4.sin_port = ((sockaddr_in *)&endpoint)->sin_port;
|
||||
peer->endpoint.addr4.sin_family = AF_INET;
|
||||
} else {
|
||||
peer->endpoint.addr6.sin6_addr = ((struct sockaddr_in6 *)&endpoint)->sin6_addr;
|
||||
peer->endpoint.addr6.sin6_port = ((struct sockaddr_in6 *)&endpoint)->sin6_port;
|
||||
peer->endpoint.addr6.sin6_family = AF_INET6;
|
||||
}
|
||||
} else {
|
||||
freeaddrinfo(resolved);
|
||||
for ((peer) = (wgConfig)->first_peer; (peer); (peer) = (peer)->next_peer) { free(peer); }
|
||||
free(wgConfig);
|
||||
free(Endpoint);
|
||||
throw std::string("Neither IPv4 nor IPv6 address found");
|
||||
}
|
||||
|
||||
freeaddrinfo(resolved);
|
||||
// Free memory
|
||||
for ((peer) = (wgConfig)->first_peer; (peer); (peer) = (peer)->next_peer) { free(peer); }
|
||||
free(wgConfig);
|
||||
free(Endpoint);
|
||||
}
|
||||
|
||||
// Set allowed IPs
|
||||
if (PeerConfig.second.allowedIPs.size() > 0) {
|
||||
wg_allowedip *newAllowedIP;
|
||||
peer->flags = (wg_peer_flags)(peer->flags|WGPEER_REPLACE_ALLOWEDIPS);
|
||||
for (const auto &Ip : PeerConfig.second.allowedIPs.getIpParsed()) {
|
||||
newAllowedIP = (wg_allowedip*)(malloc(sizeof(wg_allowedip)));
|
||||
newAllowedIP->cidr = Ip.Mask;
|
||||
if (Ip.Proto == 6 && inet_pton(AF_INET6, Ip.Address.c_str(), &newAllowedIP->ip6) == 1) newAllowedIP->family = AF_INET6;
|
||||
else if (Ip.Proto == 4 && inet_pton(AF_INET, Ip.Address.c_str(), &newAllowedIP->ip4) == 1) newAllowedIP->family = AF_INET;
|
||||
else {
|
||||
free(newAllowedIP);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (peer->first_allowedip) newAllowedIP->next_allowedip = peer->first_allowedip;
|
||||
peer->first_allowedip = newAllowedIP;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (wgConfig->first_peer) peer->next_peer = wgConfig->first_peer;
|
||||
wgConfig->first_peer = peer;
|
||||
}
|
||||
|
||||
// Set config
|
||||
status = wg_set_device(wgConfig);
|
||||
|
||||
// Free memory
|
||||
for (wg_peer* peer = wgConfig->first_peer; peer; peer = peer->next_peer) {
|
||||
for (wg_allowedip *newAllowedIP = peer->first_allowedip; newAllowedIP; newAllowedIP = newAllowedIP->next_allowedip) free(newAllowedIP);
|
||||
free(peer);
|
||||
}
|
||||
free(wgConfig);
|
||||
|
||||
// Return status to tool
|
||||
if (status < 0) throw std::string("Unable to configure settings, code: ").append(std::to_string(status));
|
||||
else {
|
||||
this->interfaceAddress.SetInInterface(this->name);
|
||||
}
|
||||
}
|
||||
|
||||
void IpManeger::SetInInterface(std::string interfaceName) {
|
||||
if (this->size() == 0) return;
|
||||
}
|
1755
addon/linux/wireguard.c
Normal file
1755
addon/linux/wireguard.c
Normal file
File diff suppressed because it is too large
Load Diff
105
addon/linux/wireguard.h
Normal file
105
addon/linux/wireguard.h
Normal file
@ -0,0 +1,105 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
/*
|
||||
* Copyright (C) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#ifndef WIREGUARD_H
|
||||
#define WIREGUARD_H
|
||||
|
||||
#include <net/if.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
#include <time.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef uint8_t wg_key[32];
|
||||
typedef char wg_key_b64_string[((sizeof(wg_key) + 2) / 3) * 4 + 1];
|
||||
|
||||
/* Cross platform __kernel_timespec */
|
||||
struct timespec64 {
|
||||
int64_t tv_sec;
|
||||
int64_t tv_nsec;
|
||||
};
|
||||
|
||||
typedef struct wg_allowedip {
|
||||
uint16_t family;
|
||||
union {
|
||||
struct in_addr ip4;
|
||||
struct in6_addr ip6;
|
||||
};
|
||||
uint8_t cidr;
|
||||
struct wg_allowedip *next_allowedip;
|
||||
} wg_allowedip;
|
||||
|
||||
enum wg_peer_flags {
|
||||
WGPEER_REMOVE_ME = 1U << 0,
|
||||
WGPEER_REPLACE_ALLOWEDIPS = 1U << 1,
|
||||
WGPEER_HAS_PUBLIC_KEY = 1U << 2,
|
||||
WGPEER_HAS_PRESHARED_KEY = 1U << 3,
|
||||
WGPEER_HAS_PERSISTENT_KEEPALIVE_INTERVAL = 1U << 4
|
||||
};
|
||||
|
||||
typedef union wg_endpoint {
|
||||
struct sockaddr addr;
|
||||
struct sockaddr_in addr4;
|
||||
struct sockaddr_in6 addr6;
|
||||
} wg_endpoint;
|
||||
|
||||
typedef struct wg_peer {
|
||||
enum wg_peer_flags flags;
|
||||
|
||||
wg_key public_key;
|
||||
wg_key preshared_key;
|
||||
|
||||
wg_endpoint endpoint;
|
||||
|
||||
struct timespec64 last_handshake_time;
|
||||
uint64_t rx_bytes, tx_bytes;
|
||||
uint16_t persistent_keepalive_interval;
|
||||
|
||||
struct wg_allowedip *first_allowedip, *last_allowedip;
|
||||
struct wg_peer *next_peer;
|
||||
} wg_peer;
|
||||
|
||||
enum wg_device_flags {
|
||||
WGDEVICE_REPLACE_PEERS = 1U << 0,
|
||||
WGDEVICE_HAS_PRIVATE_KEY = 1U << 1,
|
||||
WGDEVICE_HAS_PUBLIC_KEY = 1U << 2,
|
||||
WGDEVICE_HAS_LISTEN_PORT = 1U << 3,
|
||||
WGDEVICE_HAS_FWMARK = 1U << 4
|
||||
};
|
||||
|
||||
typedef struct wg_device {
|
||||
char name[IFNAMSIZ];
|
||||
uint32_t ifindex;
|
||||
|
||||
enum wg_device_flags flags;
|
||||
|
||||
wg_key public_key;
|
||||
wg_key private_key;
|
||||
|
||||
uint32_t fwmark;
|
||||
uint16_t listen_port;
|
||||
|
||||
struct wg_peer *first_peer, *last_peer;
|
||||
} wg_device;
|
||||
|
||||
#define wg_for_each_device_name(__names, __name, __len) for ((__name) = (__names), (__len) = 0; ((__len) = strlen(__name)); (__name) += (__len) + 1)
|
||||
#define wg_for_each_peer(__dev, __peer) for ((__peer) = (__dev)->first_peer; (__peer); (__peer) = (__peer)->next_peer)
|
||||
#define wg_for_each_allowedip(__peer, __allowedip) for ((__allowedip) = (__peer)->first_allowedip; (__allowedip); (__allowedip) = (__allowedip)->next_allowedip)
|
||||
|
||||
int wg_set_device(wg_device *dev);
|
||||
int wg_get_device(wg_device **dev, const char *device_name);
|
||||
int wg_add_device(const char *device_name);
|
||||
int wg_del_device(const char *device_name);
|
||||
void wg_free_device(wg_device *dev);
|
||||
char *wg_list_device_names(void); /* first\0second\0third\0forth\0last\0\0 */
|
||||
void wg_key_to_base64(wg_key_b64_string base64, const wg_key key);
|
||||
int wg_key_from_base64(wg_key key, const wg_key_b64_string base64);
|
||||
bool wg_key_is_zero(const wg_key key);
|
||||
void wg_generate_public_key(wg_key public_key, const wg_key private_key);
|
||||
void wg_generate_private_key(wg_key private_key);
|
||||
void wg_generate_preshared_key(wg_key preshared_key);
|
||||
|
||||
#endif
|
@ -31,13 +31,42 @@ class WireguardDevices : public std::vector<std::string> {
|
||||
}
|
||||
};
|
||||
|
||||
typedef struct IpReference {
|
||||
std::string Address;
|
||||
int Mask, Proto;
|
||||
};
|
||||
|
||||
/** Maneger Interface IPs */
|
||||
class IpManeger : public std::vector<std::string> {
|
||||
public:
|
||||
void SetInInterface(std::string interfaceName);
|
||||
|
||||
void addIP(std::string ip) {
|
||||
this->push_back(ip);
|
||||
void addIPMask(std::string ip) {
|
||||
IpReference xTop;
|
||||
auto maskStart = ip.find("/");
|
||||
auto isIPv6 = ip.find(":") != std::string::npos;
|
||||
if (isIPv6) xTop.Mask = 128;
|
||||
else xTop.Mask = 32;
|
||||
if (maskStart == std::string::npos) xTop.Address = ip;
|
||||
else {
|
||||
xTop.Address = ip.substr(0, maskStart);
|
||||
xTop.Mask = atoi(ip.substr(maskStart+1).c_str());
|
||||
if (!isIPv6 && xTop.Mask > 32) throw std::string("Set valid mask to ipv4 address!");
|
||||
}
|
||||
xTop.Proto = isIPv6 ? 6 : 4;
|
||||
this->push_back(xTop.Address.append("/").append(std::to_string(xTop.Mask)));
|
||||
}
|
||||
|
||||
std::vector<IpReference> getIpParsed() {
|
||||
std::vector<IpReference> xTops;
|
||||
for (auto ipAddrr = this->begin(); ipAddrr != this->end(); ++ipAddrr) {
|
||||
IpReference nTop;
|
||||
auto maskStart = ipAddrr->find("/");
|
||||
nTop.Address = ipAddrr->substr(0, maskStart);
|
||||
nTop.Mask = atoi(ipAddrr->substr(maskStart+1).c_str());
|
||||
xTops.push_back(nTop);
|
||||
}
|
||||
return xTops;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -13,12 +13,17 @@ sources:
|
||||
|
||||
target:
|
||||
linux:
|
||||
sources:
|
||||
- "!addon/dummy/wginterface.cpp"
|
||||
- "addon/linux/wginterface.cpp"
|
||||
- "addon/linux/wireguard.c"
|
||||
flags:
|
||||
- "!-fno-exceptions"
|
||||
- "-fpermissive"
|
||||
- "-fexceptions"
|
||||
- "-w"
|
||||
- "-fpermissive"
|
||||
- "-fPIC"
|
||||
macos:
|
||||
flags:
|
||||
- "!-fno-exceptions"
|
||||
|
Loading…
x
Reference in New Issue
Block a user