static bool
do_address_service(const bool add, const short family, const struct tuntap *tt)
{
- DWORD len;
bool ret = false;
ack_message_t ack;
struct gc_arena gc = gc_new();
addr.prefix_len = tt->netbits_ipv6;
}
- if (!WriteFile(pipe, &addr, sizeof(addr), &len, NULL)
- || !ReadFile(pipe, &ack, sizeof(ack), &len, NULL))
+ if (!send_msg_iservice(pipe, &addr, sizeof(addr), &ack, "TUN"))
{
- msg(M_WARN, "TUN: could not talk to service: %s [%lu]",
- strerror_win32(GetLastError(), &gc), GetLastError());
goto out;
}
static bool
do_dns6_service(bool add, const struct tuntap *tt)
{
- DWORD len;
bool ret = false;
ack_message_t ack;
struct gc_arena gc = gc_new();
msg(D_LOW, "%s IPv6 dns servers on '%s' (if_index = %d) using service",
(add ? "Setting" : "Deleting"), dns.iface.name, dns.iface.index);
- if (!WriteFile(pipe, &dns, sizeof(dns), &len, NULL)
- || !ReadFile(pipe, &ack, sizeof(ack), &len, NULL))
+ if (!send_msg_iservice(pipe, &dns, sizeof(dns), &ack, "TUN"))
{
- msg(M_WARN, "TUN: could not talk to service: %s [%lu]",
- strerror_win32(GetLastError(), &gc), GetLastError());
goto out;
}
.iface = { .index = tt->adapter_index, .name = "" }
};
- if (!WriteFile(pipe, &dhcp, sizeof(dhcp), &len, NULL)
- || !ReadFile(pipe, &ack, sizeof(ack), &len, NULL))
+ if (!send_msg_iservice(pipe, &dhcp, sizeof(dhcp), &ack, "Enable_dhcp"))
{
- msg(M_WARN, "Enable_dhcp: could not talk to service: %s [%lu]",
- strerror_win32(GetLastError(), &gc), GetLastError());
goto out;
}
static void
register_dns_service(const struct tuntap *tt)
{
- DWORD len;
HANDLE msg_channel = tt->options.msg_channel;
ack_message_t ack;
struct gc_arena gc = gc_new();
message_header_t rdns = { msg_register_dns, sizeof(message_header_t), 0 };
- if (!WriteFile(msg_channel, &rdns, sizeof(rdns), &len, NULL)
- || !ReadFile(msg_channel, &ack, sizeof(ack), &len, NULL))
+ if (!send_msg_iservice(msg_channel, &rdns, sizeof(rdns), &ack, "Register_dns"))
{
- msg(M_WARN, "Register_dns: could not talk to service: %s [status=0x%lx]",
- strerror_win32(GetLastError(), &gc), GetLastError());
+ gc_free(&gc);
+ return;
}
else if (ack.error_number != NO_ERROR)
.iface = { .index = index, .name = "" }
};
- if (!WriteFile(tt->options.msg_channel, &msg, sizeof(msg), &len, NULL)
- || !ReadFile(tt->options.msg_channel, &ack, sizeof(ack), &len, NULL))
+ if (send_msg_iservice(tt->options.msg_channel, &msg, sizeof(msg),
+ &ack, "TUN"))
{
- msg(M_WARN, "TUN: could not talk to service: %s [%lu]",
- strerror_win32(GetLastError(), &gc), GetLastError());
+ status = ack.error_number;
}
-
- status = ack.error_number;
}
else
{
static bool
win_block_dns_service(bool add, int index, const HANDLE pipe)
{
- DWORD len;
bool ret = false;
ack_message_t ack;
struct gc_arena gc = gc_new();
.iface = { .index = index, .name = "" }
};
- if (!WriteFile(pipe, &data, sizeof(data), &len, NULL)
- || !ReadFile(pipe, &ack, sizeof(ack), &len, NULL))
+ if (!send_msg_iservice(pipe, &data, sizeof(data), &ack, "Block_DNS"))
{
- msg(M_WARN, "Block_DNS: could not talk to service: %s [%lu]",
- strerror_win32(GetLastError(), &gc), GetLastError());
goto out;
}
return (const char *)out.data;
}
+bool
+send_msg_iservice(HANDLE pipe, const void *data, size_t size,
+ ack_message_t *ack, const char *context)
+{
+ struct gc_arena gc = gc_new();
+ DWORD len;
+ bool ret = true;
+
+ if (!WriteFile(pipe, data, size, &len, NULL)
+ || !ReadFile(pipe, ack, sizeof(*ack), &len, NULL))
+ {
+ msg(M_WARN, "%s: could not talk to service: %s [%lu]",
+ context? context : "Unknown",
+ strerror_win32(GetLastError(), &gc), GetLastError());
+ ret = false;
+ }
+
+ gc_free(&gc);
+ return ret;
+}
+
#endif /* ifdef _WIN32 */