14#ifndef OPENVPN_TUN_MAC_MACDNS_H
15#define OPENVPN_TUN_MAC_MACDNS_H
33class MacDNS :
public RC<thread_unsafe_refcount>
56 bool custom_port = std::any_of(server.addresses.begin(),
57 server.addresses.end(),
59 { return a.port != 0 && a.port != 53; });
60 if (dnssec || secure_transport || custom_port)
72 throw macdns_error(
"no applicable DNS server config found");
93 std::ostringstream
os;
122 for (
const auto &rd : server.
domains)
152 OPENVPN_LOG(
"MacDNS: Error: No support for Mac OS X versions earlier than 10.6");
156 args.push_back(
"/usr/bin/dscacheutil");
157 args.push_back(
"-flushcache");
164 args.push_back(
"/usr/bin/killall");
165 args.push_back(
"-HUP");
166 args.push_back(
"mDNSResponder");
262 catch (
const std::exception &e)
264 OPENVPN_LOG(
"MacDNS: setdns exception: " << e.what());
295 catch (
const std::exception &e)
297 OPENVPN_LOG(
"MacDNS: resetdns exception: " << e.what());
352 class Info :
public RC<thread_unsafe_refcount>
358 :
ipv4(sc,
sname,
"State:/Network/Global/IPv4"),
367 std::ostringstream
os;
392 throw macdns_error(
"no primary service");
393 return "Setup:/Network/Service/" + serv +
"/DNS";
std::string to_string() const
std::string to_string() const
static bool signal_network_reconfiguration(const std::string &sname)
static CF::DynamicStore ds_create(const std::string &sname)
std::string to_string() const
void backup_orig(const std::string &key, const bool wipe_orig=true)
Config(const TunBuilderCapture &settings)
std::string to_string() const
CF::Array resolve_domains
static CF::Array get_resolve_domains(const DnsServer &server)
static CF::Array get_search_domains(const TunBuilderCapture &settings)
CF::Array server_addresses
static CF::Array get_server_addresses(const DnsServer &server)
Info(CF::DynamicStore &sc, const std::string &sname)
static std::string primary_dns(const CF::Dict &ipv4, const CF::Dict &info)
bool interface_change(Info *other) const
std::string to_string() const
OPENVPN_EXCEPTION(macdns_error)
CF::Array dskey_array() const
CF::DynamicStore ds_create() const
bool setdns(const Config &config)
std::string to_string() const
bool reset_primary_dns(Info *info)
bool signal_network_reconfiguration()
void interface_change_cleanup(Info *info)
MacDNS(const std::string &sname_arg)
void reset() noexcept
Points this RCPtr<T> to nullptr safely.
T * get() const noexcept
Returns the raw pointer to the object T, or nullptr.
Reference count base class for objects tracked by RCPtr. Disallows copying and assignment.
#define OPENVPN_LOG(args)
CFIndex array_len(const ARRAY &array)
void dict_set_int(MutableDict &dict, const KEY &key, int value)
MutableArray mutable_array(const CFIndex capacity=0)
std::string array_to_string(const ARRAY &array, const char delim=',')
Array const_array(MutableArray &marray)
CFIndex dict_len(const DICT &dict)
CFTypeRef dict_get_obj(const DICT &dict, const KEY &key)
void dict_set_obj(MutableDict &dict, const KEY &key, CFTypeRef value)
void array_append_str(MutableArray &array, const VALUE &value)
std::string dict_get_str(const DICT &dict, const KEY &key)
int system_cmd(const std::string &cmd, const Argv &argv, RedirectBase *redir, const Environ *env, const sigset_t *sigmask)
A name server address and optional port.
std::map< int, DnsServer > servers
std::vector< DnsDomain > search_domains
DNS settings for a name server.
std::vector< DnsAddress > addresses
std::vector< DnsDomain > domains
static const char config[]