summary refs log tree commit diff
path: root/src/core/nm-dispatcher.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/nm-dispatcher.c')
-rw-r--r--src/core/nm-dispatcher.c51
1 files changed, 44 insertions, 7 deletions
diff --git a/src/core/nm-dispatcher.c b/src/core/nm-dispatcher.c
index cdc07dd6..9aa4194e 100644
--- a/src/core/nm-dispatcher.c
+++ b/src/core/nm-dispatcher.c
@@ -50,6 +50,8 @@
     }                                                         \
     G_STMT_END
 
+static gboolean nm_dispatcher_need_device(NMDispatcherAction action);
+
 /*****************************************************************************/
 
 struct NMDispatcherCallId {
@@ -469,7 +471,8 @@ static const char *action_table[] = {[NM_DISPATCHER_ACTION_HOSTNAME]      = NMD_
                                      [NM_DISPATCHER_ACTION_DHCP_CHANGE_6] = NMD_ACTION_DHCP6_CHANGE,
                                      [NM_DISPATCHER_ACTION_CONNECTIVITY_CHANGE] =
                                          NMD_ACTION_CONNECTIVITY_CHANGE,
-                                     [NM_DISPATCHER_ACTION_REAPPLY] = NMD_ACTION_REAPPLY};
+                                     [NM_DISPATCHER_ACTION_REAPPLY]    = NMD_ACTION_REAPPLY,
+                                     [NM_DISPATCHER_ACTION_DNS_CHANGE] = NMD_ACTION_DNS_CHANGE};
 
 static const char *
 action_to_string(NMDispatcherAction action)
@@ -530,9 +533,7 @@ _dispatcher_call(NMDispatcherAction    action,
     if (G_UNLIKELY(!request_id))
         request_id = ++gl.request_id_counter;
 
-    /* All actions except 'hostname' and 'connectivity-change' require a device */
-    if (action == NM_DISPATCHER_ACTION_HOSTNAME
-        || action == NM_DISPATCHER_ACTION_CONNECTIVITY_CHANGE) {
+    if (!nm_dispatcher_need_device(action)) {
         _LOG2D(request_id,
                log_ifname,
                log_con_uuid,
@@ -592,9 +593,8 @@ _dispatcher_call(NMDispatcherAction    action,
     g_variant_builder_init(&vpn_ip4_props, G_VARIANT_TYPE_VARDICT);
     g_variant_builder_init(&vpn_ip6_props, G_VARIANT_TYPE_VARDICT);
 
-    /* hostname and connectivity-change actions don't send device data */
-    if (action != NM_DISPATCHER_ACTION_HOSTNAME
-        && action != NM_DISPATCHER_ACTION_CONNECTIVITY_CHANGE) {
+    /* hostname, DNS and connectivity-change actions don't send device data */
+    if (nm_dispatcher_need_device(action)) {
         fill_device_props(device,
                           &device_props,
                           &device_proxy_props,
@@ -925,6 +925,30 @@ nm_dispatcher_call_connectivity(NMConnectivityState  connectivity_state,
                             out_call_id);
 }
 
+/**
+ * nm_dispatcher_call_dns_change():
+ *
+ * This method does not block the caller.
+ *
+ * Returns: %TRUE if the action was dispatched, %FALSE on failure
+ */
+gboolean
+nm_dispatcher_call_dns_change(void)
+{
+    return _dispatcher_call(NM_DISPATCHER_ACTION_DNS_CHANGE,
+                            FALSE,
+                            NULL,
+                            NULL,
+                            NULL,
+                            FALSE,
+                            NM_CONNECTIVITY_UNKNOWN,
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL);
+}
+
 void
 nm_dispatcher_call_cancel(NMDispatcherCallId *call_id)
 {
@@ -937,3 +961,16 @@ nm_dispatcher_call_cancel(NMDispatcherCallId *call_id)
     _LOG3D(call_id, "cancelling dispatcher callback action");
     call_id->callback = NULL;
 }
+
+/* All actions except 'hostname', 'connectivity-change' and 'dns-change' require
+ * a device */
+static gboolean
+nm_dispatcher_need_device(NMDispatcherAction action)
+{
+    if (action == NM_DISPATCHER_ACTION_HOSTNAME
+        || action == NM_DISPATCHER_ACTION_CONNECTIVITY_CHANGE
+        || action == NM_DISPATCHER_ACTION_DNS_CHANGE) {
+        return FALSE;
+    }
+    return TRUE;
+}