blob: ae4f473d4cabacc7c577a8622306060a9e9461b4 [file] [log] [blame]
#include "piped.h"
#include "piped_uci.h"
#include "piped_util.h"
#include "piped_nw.h"
#include "piped_dhcp.h"
#include "piped_dns.h"
static int pd_add_del_dns6(struct pd_context *pdc, struct pd_iface *pdi,
bool add)
{
struct uci_context *c = pdc->c;
if (!pdi_test(pdi, PDI_DNS6P) && !pdi_test(pdi, PDI_DNS6S))
return 0;
if (add) {
if (pdi_test(pdi, PDI_DNS6P) && pd_uci_add_list(c,
UCI_PKG_DHCP,
UCI_SEC_LAN,
UCI_OPT_DNS,
pdi->dns6p)) {
PD_ERR(pd_add_del_dns6, "add dns6p failed\n");
return 1;
}
if (pdi_test(pdi, PDI_DNS6S) && pd_uci_add_list(c, UCI_PKG_DHCP,
UCI_SEC_LAN,
UCI_OPT_DNS,
pdi->dns6s)) {
PD_ERR(pd_add_del_dns61, "add dns6s failed\n");
return 1;
}
} else {
if (pdi_test(pdi, PDI_DNS6P) && pd_uci_del_from_list(c,
UCI_PKG_DHCP,
UCI_SEC_LAN,
UCI_OPT_DNS,
pdi->dns6p)) {
PD_ERR(pd_add_del_dns62, "del dns6p failed\n");
return 1;
}
if (pdi_test(pdi, PDI_DNS6S) && pd_uci_del_from_list(c,
UCI_PKG_DHCP,
UCI_SEC_LAN,
UCI_OPT_DNS,
pdi->dns6s)) {
PD_ERR(pd_add_del_dns63, "del dns6p failed\n");
return 1;
}
}
pd_set(&pdc->status, PDC_ODHCPD_CHANGED);
return 0;
}
static int pd_add_del_dns4(struct pd_context *pdc, struct pd_iface *pdi,
bool add)
{
struct uci_context *c = pdc->c;
char options[MAX_DHCP_OPT_STR_LEN];
if (!pdi_test(pdi, PDI_DNS4P) && !pdi_test(pdi, PDI_DNS4S))
return 0;
strcpy(options, UCI_DHCP_OPTNUM_DNS);
if (pdi_test(pdi, PDI_DNS4P)) {
strcat(options, ",");
strcat(options, pdi->dns4p);
}
if (pdi_test(pdi, PDI_DNS4S)) {
strcat(options, ",");
strcat(options, pdi->dns4s);
}
if (add && pd_uci_add_list(c, UCI_PKG_DHCP, UCI_SEC_LAN,
UCI_OPT_DHCP_OPT, options)) {
PD_ERR(pd_add_del_dns4, "dhcp add dns4 failed\n");
return 1;
} else if (!add && pd_uci_del_from_list(c, UCI_PKG_DHCP, UCI_SEC_LAN,
UCI_OPT_DHCP_OPT, options)) {
PD_ERR(pd_add_del_dns41, "dhcp del dns4 failed\n");
return 1;
}
pd_set(&pdc->status, PDC_DNSMASQ_CHANGED);
return 0;
}
int pd_dns4_add(struct pd_context *pdc, struct pd_iface *pdi)
{
if (pd_add_del_dns4(pdc, pdi, true)) {
PD_ERR(pd_dns4_add, "pd_add_del_dns4 failed for %s\n", pdi->sec);
return 1;
}
return 0;
}
int pd_dns4_del(struct pd_context *pdc, struct pd_iface *pdi)
{
if (pd_add_del_dns4(pdc, pdi, false)) {
PD_ERR(pd_dns4_del, "pd_add_del_dns4 failed for %s\n", pdi->sec);
return 1;
}
return 0;
}
int pd_dns4_change(struct pd_context *pdc, struct pd_iface *oldi,
struct pd_iface *newi)
{
if (pd_dns4_del(pdc, oldi)) {
PD_ERR(pd_dns4_change, "pd_dns4_del failed\n");
return 1;
}
if (pd_dns4_add(pdc, newi)) {
PD_ERR(pd_dns4_change1, "pd_dns4_add failed\n");
return 1;
}
return 0;
}
int pd_dns6_add(struct pd_context *pdc, struct pd_iface *pdi)
{
if (pd_add_del_dns6(pdc, pdi, true)) {
PD_ERR(pd_dns6_add, "pd_add_del_dns6 failed for %s\n", pdi->sec);
return 1;
}
return 0;
}
int pd_dns6_change(struct pd_context *pdc, struct pd_iface *oldi,
struct pd_iface *newi)
{
if (pd_dns6_del(pdc, oldi)) {
PD_ERR(pd_dns6_change, "pd_dns6_del failed\n");
return 1;
}
if (pd_dns6_add(pdc, newi)) {
PD_ERR(pd_dns6_change1, "pd_dns6_add failed\n");
return 1;
}
return 0;
}
int pd_dns6_del(struct pd_context *pdc, struct pd_iface *pdi)
{
if (pd_add_del_dns6(pdc, pdi, false)) {
PD_ERR(pd_dns6_del, "pd_add_del_dns6 failed\n");
return 1;
}
return 0;
}
void pd_dns_clean(struct pd_context *pdc)
{
struct uci_context *c = pdc->c;
if (pd_uci_del(c, UCI_PKG_DHCP, UCI_SEC_LAN, UCI_OPT_DNS, NULL))
return;
PD_INFO(pd_dns_clean, "cleaning dns configuration\n");
pd_set(&pdc->status, PDC_ODHCPD_CHANGED);
}