summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOdd Stranne <odd@mullvad.net>2018-05-31 23:17:09 +0200
committerOdd Stranne <odd@mullvad.net>2018-06-18 08:45:14 +0200
commit23525e2635b88a90813badf69a0569bcf3ffcb88 (patch)
tree68db0fd75d8daa26b1004b7dfa05f9b7e5a50956
parent3fc904d6278ed3a0b1fdbc8ed98941133a87376c (diff)
downloadmullvadvpn-23525e2635b88a90813badf69a0569bcf3ffcb88.tar.xz
mullvadvpn-23525e2635b88a90813badf69a0569bcf3ffcb88.zip
Update WINDNS public API
-rw-r--r--windows/windns/src/windns/clientsinkinfo.h21
-rw-r--r--windows/windns/src/windns/windns.cpp25
-rw-r--r--windows/windns/src/windns/windns.h29
3 files changed, 72 insertions, 3 deletions
diff --git a/windows/windns/src/windns/clientsinkinfo.h b/windows/windns/src/windns/clientsinkinfo.h
new file mode 100644
index 0000000000..db42485d8e
--- /dev/null
+++ b/windows/windns/src/windns/clientsinkinfo.h
@@ -0,0 +1,21 @@
+#pragma once
+
+#include "windns.h"
+
+struct ErrorSinkInfo
+{
+ WinDnsErrorSink sink;
+ void *context;
+};
+
+struct ConfigSinkInfo
+{
+ WinDnsConfigSink sink;
+ void *context;
+};
+
+struct ClientSinkInfo
+{
+ ErrorSinkInfo errorSinkInfo;
+ ConfigSinkInfo configSinkInfo;
+};
diff --git a/windows/windns/src/windns/windns.cpp b/windows/windns/src/windns/windns.cpp
index 7a9977951f..741d0f3670 100644
--- a/windows/windns/src/windns/windns.cpp
+++ b/windows/windns/src/windns/windns.cpp
@@ -1,6 +1,7 @@
#include "stdafx.h"
#include "windns.h"
#include "windnscontext.h"
+#include "clientsinkinfo.h"
#include <vector>
#include <string>
@@ -85,7 +86,9 @@ bool
WINDNS_API
WinDns_Set(
const wchar_t **servers,
- uint32_t numServers
+ uint32_t numServers,
+ WinDnsConfigSink configSink,
+ void *configContext
)
{
if (nullptr == g_Context)
@@ -108,7 +111,12 @@ WinDns_Set(
// Onwards.
//
- return g_Context->set(MakeStringArray(servers, numServers), g_ErrorSink, g_ErrorContext);
+ ClientSinkInfo sinkInfo;
+
+ sinkInfo.errorSinkInfo = ErrorSinkInfo{ g_ErrorSink, g_ErrorContext };
+ sinkInfo.configSinkInfo = ConfigSinkInfo{ configSink, configContext };
+
+ return g_Context->set(MakeStringArray(servers, numServers), sinkInfo);
}
catch (std::exception &err)
{
@@ -154,3 +162,16 @@ WinDns_Reset(
return false;
}
}
+
+WINDNS_LINKAGE
+bool
+WINDNS_API
+WinDns_Recover(
+ const void *configData,
+ uint32_t dataLength
+)
+{
+ // TODO: smart stuff
+
+ return false;
+}
diff --git a/windows/windns/src/windns/windns.h b/windows/windns/src/windns/windns.h
index 000913ad53..734719ca80 100644
--- a/windows/windns/src/windns/windns.h
+++ b/windows/windns/src/windns/windns.h
@@ -18,6 +18,7 @@
///////////////////////////////////////////////////////////////////////////////
typedef void (WINDNS_API *WinDnsErrorSink)(const char *errorMessage, void *context);
+typedef void (WINDNS_API *WinDnsConfigSink)(const void *configData, uint32_t dataLength, void *context);
//
// WinDns_Initialize:
@@ -55,13 +56,20 @@ WinDns_Deinitialize(
//
// Configure which DNS servers should be used and start enforcing these settings.
//
+// The 'configSink' will receive periodic callbacks with updated config data
+// until you call WinDns_Reset.
+//
+// You should persist the config data in preparation for an eventual recovery.
+//
extern "C"
WINDNS_LINKAGE
bool
WINDNS_API
WinDns_Set(
const wchar_t **servers,
- uint32_t numServers
+ uint32_t numServers,
+ WinDnsConfigSink configSink,
+ void *configContext
);
//
@@ -72,9 +80,28 @@ WinDns_Set(
// (Also taking into account external changes to DNS settings that have occurred
// during the period of enforcing specific settings.)
//
+// It's safe to discard persisted config data once WinDns_Reset returns 'true'.
+//
extern "C"
WINDNS_LINKAGE
bool
WINDNS_API
WinDns_Reset(
);
+
+//
+// WinDns_Recover:
+//
+// Recover adapter configurations from a previously persisted state.
+//
+// This is useful if the machine has been abruptly powered off and
+// WINDNS did not get a chance to restore settings.
+//
+extern "C"
+WINDNS_LINKAGE
+bool
+WINDNS_API
+WinDns_Recover(
+ const void *configData,
+ uint32_t dataLength
+);