]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
dbus: Add RemoveAllNetworks to the new D-Bus API
authorSam Leffler <sleffler@google.com>
Sun, 20 Mar 2011 10:12:12 +0000 (12:12 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 20 Mar 2011 10:12:12 +0000 (12:12 +0200)
This adds a new command to the interface to remove all configured
netblocks. Without this it's necessary to query properties on the
interface and explicitly remove each netblock.

wpa_supplicant/config.c
wpa_supplicant/config.h
wpa_supplicant/dbus/dbus_new.c
wpa_supplicant/dbus/dbus_new_handlers.c
wpa_supplicant/dbus/dbus_new_handlers.h

index de68ec845ea3bc7e341a7edb50c7ecbb2a3d0d8f..dd6bc43a141dfe97194ce5713457677942af5aef 100644 (file)
@@ -1730,6 +1730,31 @@ void wpa_config_free(struct wpa_config *config)
 }
 
 
+/**
+ * wpa_config_foreach_network - Iterate over each configured network
+ * @config: Configuration data from wpa_config_read()
+ * @func: Callback function to process each network
+ * @arg: Opaque argument to pass to callback function
+ *
+ * Iterate over the set of configured networks calling the specified
+ * function for each item. We guard against callbacks removing the
+ * supplied network.
+ */
+void wpa_config_foreach_network(struct wpa_config *config,
+                               void (*func)(void *, struct wpa_ssid *),
+                               void *arg)
+{
+       struct wpa_ssid *ssid, *next;
+
+       ssid = config->ssid;
+       while (ssid) {
+               next = ssid->next;
+               func(arg, ssid);
+               ssid = next;
+       }
+}
+
+
 /**
  * wpa_config_get_network - Get configured network based on id
  * @config: Configuration data from wpa_config_read()
index 75406ef3a6ea240c63b186fa16528dc49c5bca64..9e9e0f77efdfa82e20e819e38175edddf3ad9591 100644 (file)
@@ -410,6 +410,9 @@ struct wpa_config {
 
 void wpa_config_free(struct wpa_config *ssid);
 void wpa_config_free_ssid(struct wpa_ssid *ssid);
+void wpa_config_foreach_network(struct wpa_config *config,
+                               void (*func)(void *, struct wpa_ssid *),
+                               void *arg);
 struct wpa_ssid * wpa_config_get_network(struct wpa_config *config, int id);
 struct wpa_ssid * wpa_config_add_network(struct wpa_config *config);
 int wpa_config_remove_network(struct wpa_config *config, int id);
index d86552fad0f7652ec8e99da847fa274c851060c9..63bea98e848d0aad7cfaed305ca1461181b957d7 100644 (file)
@@ -1312,6 +1312,12 @@ static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = {
                  END_ARGS
          }
        },
+       { "RemoveAllNetworks", WPAS_DBUS_NEW_IFACE_INTERFACE,
+         (WPADBusMethodHandler) &wpas_dbus_handler_remove_all_networks,
+         {
+                 END_ARGS
+         }
+       },
        { "SelectNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
          (WPADBusMethodHandler) &wpas_dbus_handler_select_network,
          {
index b590d6216cc5eca70f1159f12965e2fc661f8193..c7014328b01c2178fe2f20e53264e8e602087109 100644 (file)
@@ -1470,6 +1470,42 @@ out:
 }
 
 
+static void remove_network(void *arg, struct wpa_ssid *ssid)
+{
+       struct wpa_supplicant *wpa_s = arg;
+
+       wpas_notify_network_removed(wpa_s, ssid);
+
+       if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) {
+               wpa_printf(MSG_ERROR,
+                          "wpas_dbus_handler_remove_all_networks[dbus]: "
+                          "error occurred when removing network %d",
+                          ssid->id);
+               return;
+       }
+
+       if (ssid == wpa_s->current_ssid)
+               wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
+}
+
+
+/**
+ * wpas_dbus_handler_remove_all_networks - Remove all configured networks
+ * @message: Pointer to incoming dbus message
+ * @wpa_s: wpa_supplicant structure for a network interface
+ * Returns: NULL on success or dbus error on failure
+ *
+ * Handler function for "RemoveAllNetworks" method call of a network interface.
+ */
+DBusMessage * wpas_dbus_handler_remove_all_networks(
+       DBusMessage *message, struct wpa_supplicant *wpa_s)
+{
+       /* NB: could check for failure and return an error */
+       wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s);
+       return NULL;
+}
+
+
 /**
  * wpas_dbus_handler_select_network - Attempt association with a network
  * @message: Pointer to incoming dbus message
index dcac3520aad4a3e4199a390128566a7835dc5daf..288cd43b926fbffcd80cc2983e2664fc8ac1bbaa 100644 (file)
@@ -83,6 +83,9 @@ DBusMessage * wpas_dbus_handler_add_network(DBusMessage *message,
 DBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message,
                                               struct wpa_supplicant *wpa_s);
 
+DBusMessage * wpas_dbus_handler_remove_all_networks(
+       DBusMessage *message, struct wpa_supplicant *wpa_s);
+
 DBusMessage * wpas_dbus_handler_select_network(DBusMessage *message,
                                               struct wpa_supplicant *wpa_s);