Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions src/http.c
Original file line number Diff line number Diff line change
Expand Up @@ -899,6 +899,40 @@ static int parse_xml_config(struct tunnel *tunnel, const char *buffer)
}
}

// The it could be split-dns instead of global dns
val = buffer;
while ((val = xml_find('<', "split-dns", val, 2))) {
char *domains, *dnsserver1, *dnsserver2;

domains = xml_get(xml_find(' ', "domains=", val, 1));
if (!domains) {
log_warn("No domain names for a split-dns\n");
continue;
}

dnsserver1 = xml_get(xml_find(' ', "dnsserver1=", val, 1));
if (!dnsserver1) {
log_warn("No dnsserver1 for a split-dns\n");
free(domains);
continue;
}

dnsserver2 = xml_get(xml_find(' ', "dnsserver2=", val, 1));
if (!dnsserver2) {
log_warn("No dnsserver2 for a split-dns\n");
free(dnsserver1);
free(domains);
continue;
}

ipv4_add_split_dns(tunnel, domains, dnsserver1, dnsserver2);

free(domains);
free(dnsserver1);
free(dnsserver2);

}

// Routes the tunnel wants to push
val = xml_find('<', "split-tunnel-info", buffer, 1);
while ((val = xml_find('<', "addr", val, 2))) {
Expand Down
17 changes: 17 additions & 0 deletions src/ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -832,6 +832,23 @@ static void add_text_route(struct tunnel *tunnel, const char *dest,
}
#endif

int ipv4_add_split_dns(struct tunnel *tunnel, char *domains, char *server1,
char *server2)
{
char env_var[32]; // strlen("VPN_SPLITDNS_SERVER1_") + strlen("65535") + 1

sprintf(env_var, "VPN_SPLITDNS_DOMAIN_%d", tunnel->ipv4.split_dns);
setenv(env_var, domains, 0);
sprintf(env_var, "VPN_SPLITDNS_SERVER1_%d", tunnel->ipv4.split_dns);
setenv(env_var, server1, 0);
if (server2 != NULL) {
sprintf(env_var, "VPN_SPLITDNS_SERVER2_%d", tunnel->ipv4.split_dns);
setenv(env_var, server2, 0);
}
tunnel->ipv4.split_dns++;
return 0;
}

int ipv4_add_split_vpn_route(struct tunnel *tunnel, char *dest, char *mask,
char *gateway)
{
Expand Down
4 changes: 4 additions & 0 deletions src/ipv4.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ struct ipv4_config {
int dns_suffix_was_there; // was the dns suffix already there?
int split_routes;
int route_to_vpn_is_added;
int split_dns;

struct rtentry def_rt; // default route
struct rtentry gtw_rt; // route to access VPN gateway
Expand All @@ -85,6 +86,9 @@ static inline struct sockaddr_in *cast_addr(struct sockaddr *addr)

struct tunnel;

int ipv4_add_split_dns(struct tunnel *tunnel, char *domains, char *server1,
char *server2);

int ipv4_add_split_vpn_route(struct tunnel *tunnel, char *dest, char *mask,
char *gateway);
int ipv4_set_tunnel_routes(struct tunnel *tunnel);
Expand Down