osx-attr: Optionally replace existing DNS server instead of appending them
This commit is contained in:
parent
d13c8f8f7f
commit
61d6cdb926
|
@ -31,6 +31,16 @@ struct private_osx_attr_handler_t {
|
||||||
* Public interface
|
* Public interface
|
||||||
*/
|
*/
|
||||||
osx_attr_handler_t public;
|
osx_attr_handler_t public;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Backup of original DNS servers, before we mess with it
|
||||||
|
*/
|
||||||
|
CFMutableArrayRef original;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append DNS servers to existing entries, instead of replacing
|
||||||
|
*/
|
||||||
|
bool append;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -110,7 +120,8 @@ static CFMutableArrayRef get_array_from_dict(CFDictionaryRef dict,
|
||||||
/**
|
/**
|
||||||
* Add/Remove a DNS server to the configuration
|
* Add/Remove a DNS server to the configuration
|
||||||
*/
|
*/
|
||||||
static bool manage_dns(int family, chunk_t data, bool add)
|
static bool manage_dns(private_osx_attr_handler_t *this,
|
||||||
|
int family, chunk_t data, bool add)
|
||||||
{
|
{
|
||||||
SCDynamicStoreRef store;
|
SCDynamicStoreRef store;
|
||||||
CFStringRef path, dns;
|
CFStringRef path, dns;
|
||||||
|
@ -138,6 +149,11 @@ static bool manage_dns(int family, chunk_t data, bool add)
|
||||||
dns = CFStringCreateWithCString(NULL, buf, kCFStringEncodingUTF8);
|
dns = CFStringCreateWithCString(NULL, buf, kCFStringEncodingUTF8);
|
||||||
if (add)
|
if (add)
|
||||||
{
|
{
|
||||||
|
if (!this->append && !this->original)
|
||||||
|
{ /* backup orignal config, start with empty set */
|
||||||
|
this->original = arr;
|
||||||
|
arr = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
|
||||||
|
}
|
||||||
DBG1(DBG_CFG, "installing %s as DNS server", buf);
|
DBG1(DBG_CFG, "installing %s as DNS server", buf);
|
||||||
CFArrayInsertValueAtIndex(arr, 0, dns);
|
CFArrayInsertValueAtIndex(arr, 0, dns);
|
||||||
}
|
}
|
||||||
|
@ -150,6 +166,12 @@ static bool manage_dns(int family, chunk_t data, bool add)
|
||||||
DBG1(DBG_CFG, "removing %s from DNS servers (%d)", buf, i);
|
DBG1(DBG_CFG, "removing %s from DNS servers (%d)", buf, i);
|
||||||
CFArrayRemoveValueAtIndex(arr, i);
|
CFArrayRemoveValueAtIndex(arr, i);
|
||||||
}
|
}
|
||||||
|
if (!this->append && this->original && CFArrayGetCount(arr) == 0)
|
||||||
|
{ /* restore original config */
|
||||||
|
CFRelease(arr);
|
||||||
|
arr = this->original;
|
||||||
|
this->original = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
CFRelease(dns);
|
CFRelease(dns);
|
||||||
CFDictionarySetValue(dict, CFSTR("ServerAddresses"), arr);
|
CFDictionarySetValue(dict, CFSTR("ServerAddresses"), arr);
|
||||||
|
@ -175,7 +197,7 @@ METHOD(attribute_handler_t, handle, bool,
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case INTERNAL_IP4_DNS:
|
case INTERNAL_IP4_DNS:
|
||||||
return manage_dns(AF_INET, data, TRUE);
|
return manage_dns(this, AF_INET, data, TRUE);
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -188,7 +210,7 @@ METHOD(attribute_handler_t, release, void,
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case INTERNAL_IP4_DNS:
|
case INTERNAL_IP4_DNS:
|
||||||
manage_dns(AF_INET, data, FALSE);
|
manage_dns(this, AF_INET, data, FALSE);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -240,6 +262,8 @@ osx_attr_handler_t *osx_attr_handler_create()
|
||||||
},
|
},
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
|
.append = lib->settings->get_bool(lib->settings,
|
||||||
|
"%s.plugins.osx-attr.append", TRUE, lib->ns),
|
||||||
);
|
);
|
||||||
|
|
||||||
return &this->public;
|
return &this->public;
|
||||||
|
|
Loading…
Reference in New Issue