Add support for debug settings in supplicant test program
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 30 Dec 2009 10:38:37 +0000 (02:38 -0800)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 30 Dec 2009 10:38:37 +0000 (02:38 -0800)
tools/supplicant-dbus.c
tools/supplicant-dbus.h
tools/supplicant.c
tools/supplicant.h

index 3f1c9af..e6378c3 100644 (file)
@@ -98,14 +98,14 @@ void supplicant_dbus_property_foreach(DBusMessageIter *iter,
        }
 }
 
-struct property_data {
+struct property_get_data {
        supplicant_dbus_property_function function;
        void *user_data;
 };
 
 static void property_get_all_reply(DBusPendingCall *call, void *user_data)
 {
-       struct property_data *data = user_data;
+       struct property_get_data *data = user_data;
        DBusMessage *reply;
        DBusMessageIter iter;
 
@@ -133,7 +133,7 @@ int supplicant_dbus_property_get_all(const char *path, const char *interface,
                                supplicant_dbus_property_function function,
                                                        void *user_data)
 {
-       struct property_data *data;
+       struct property_get_data *data;
        DBusMessage *message;
        DBusPendingCall *call;
 
@@ -178,3 +178,78 @@ int supplicant_dbus_property_get_all(const char *path, const char *interface,
 
        return 0;
 }
+
+struct property_set_data {
+       void *user_data;
+};
+
+static void property_set_reply(DBusPendingCall *call, void *user_data)
+{
+       //struct property_set_data *data = user_data;
+       DBusMessage *reply;
+
+       reply = dbus_pending_call_steal_reply(call);
+       if (reply == NULL)
+               return;
+
+       dbus_message_unref(reply);
+}
+
+int supplicant_dbus_property_set(const char *path, const char *interface,
+                               const char *key, const char *signature,
+                               supplicant_dbus_value_function function,
+                                                       void *user_data)
+{
+       struct property_set_data *data;
+       DBusMessage *message;
+       DBusMessageIter iter, value;
+       DBusPendingCall *call;
+
+       if (path == NULL || interface == NULL)
+               return -EINVAL;
+
+       data = dbus_malloc0(sizeof(*data));
+       if (data == NULL)
+               return -ENOMEM;
+
+       message = dbus_message_new_method_call(SUPPLICANT_SERVICE, path,
+                                       DBUS_INTERFACE_PROPERTIES, "Set");
+       if (message == NULL) {
+               dbus_free(data);
+               return -ENOMEM;
+       }
+
+       dbus_message_set_auto_start(message, FALSE);
+
+       dbus_message_iter_init_append(message, &iter);
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &interface);
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key);
+
+       dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
+                                                       signature, &value);
+       if (function != NULL)
+               function(&value, user_data);
+       dbus_message_iter_close_container(&iter, &value);
+
+       if (dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT) == FALSE) {
+               dbus_message_unref(message);
+               dbus_free(data);
+               return -EIO;
+       }
+
+       if (call == NULL) {
+               dbus_message_unref(message);
+               dbus_free(data);
+               return -EIO;
+       }
+
+       data->user_data = user_data;
+
+       dbus_pending_call_set_notify(call, property_set_reply,
+                                                       data, dbus_free);
+
+       dbus_message_unref(message);
+
+       return 0;
+}
index 04cf0f5..51981e2 100644 (file)
@@ -31,6 +31,9 @@ typedef void (* supplicant_dbus_array_function) (DBusMessageIter *iter,
 typedef void (* supplicant_dbus_property_function) (const char *key,
                                DBusMessageIter *iter, void *user_data);
 
+typedef void (* supplicant_dbus_value_function) (DBusMessageIter *iter,
+                                                       void *user_data);
+
 void supplicant_dbus_setup(DBusConnection *conn);
 
 void supplicant_dbus_array_foreach(DBusMessageIter *iter,
@@ -44,3 +47,8 @@ void supplicant_dbus_property_foreach(DBusMessageIter *iter,
 int supplicant_dbus_property_get_all(const char *path, const char *interface,
                                supplicant_dbus_property_function function,
                                                        void *user_data);
+
+int supplicant_dbus_property_set(const char *path, const char *interface,
+                               const char *key, const char *signature,
+                               supplicant_dbus_value_function function,
+                                                       void *user_data);
index 9a9f1a0..cd5c6ae 100644 (file)
@@ -48,6 +48,10 @@ static DBusConnection *connection;
 
 static const struct supplicant_callbacks *callbacks_pointer;
 
+static dbus_int32_t debug_level = 0;
+static dbus_bool_t debug_show_timestamps = FALSE;
+static dbus_bool_t debug_show_keys = FALSE;
+
 static unsigned int eap_methods;
 
 struct strvalmap {
@@ -879,12 +883,25 @@ static void service_property(const char *key, DBusMessageIter *iter,
        if (key == NULL)
                return;
 
-       if (g_strcmp0(key, "Interfaces") == 0)
+       if (g_strcmp0(key, "DebugParams") == 0) {
+               DBusMessageIter list;
+
+               dbus_message_iter_recurse(iter, &list);
+               dbus_message_iter_get_basic(&list, &debug_level);
+
+               dbus_message_iter_next(&list);
+               dbus_message_iter_get_basic(&list, &debug_show_timestamps);
+
+               dbus_message_iter_next(&list);
+               dbus_message_iter_get_basic(&list, &debug_show_keys);
+
+               DBG("Debug level %d (timestamps %u keys %u)", debug_level,
+                               debug_show_timestamps, debug_show_keys);
+       } else if (g_strcmp0(key, "Interfaces") == 0) {
                supplicant_dbus_array_foreach(iter, interface_added, user_data);
-       else if (g_strcmp0(key, "EapMethods") == 0) {
+       else if (g_strcmp0(key, "EapMethods") == 0) {
                supplicant_dbus_array_foreach(iter, eap_method, user_data);
                debug_strvalmap("EAP method", eap_method_map, eap_methods);
-       } else if (g_strcmp0(key, "DebugParams") == 0) {
        }
 }
 
@@ -924,6 +941,14 @@ static void signal_name_owner_changed(const char *path, DBusMessageIter *iter)
                supplicant_bootstrap();
 }
 
+static void signal_properties_changed(const char *path, DBusMessageIter *iter)
+{
+       if (g_strcmp0(path, SUPPLICANT_PATH) != 0)
+               return;
+
+       supplicant_dbus_property_foreach(iter, service_property, NULL);
+}
+
 static void signal_interface_added(const char *path, DBusMessageIter *iter)
 {
        if (g_strcmp0(path, SUPPLICANT_PATH) == 0)
@@ -985,11 +1010,12 @@ static struct {
        const char *member;
        void (*function) (const char *path, DBusMessageIter *iter);
 } signal_map[] = {
-       { DBUS_INTERFACE_DBUS,  "NameOwnerChanged", signal_name_owner_changed },
+       { DBUS_INTERFACE_DBUS,  "NameOwnerChanged",  signal_name_owner_changed },
 
-       { SUPPLICANT_INTERFACE, "InterfaceAdded",   signal_interface_added    },
-       { SUPPLICANT_INTERFACE, "InterfaceCreated", signal_interface_added    },
-       { SUPPLICANT_INTERFACE, "InterfaceRemoved", signal_interface_removed  },
+       { SUPPLICANT_INTERFACE, "PropertiesChanged", signal_properties_changed },
+       { SUPPLICANT_INTERFACE, "InterfaceAdded",    signal_interface_added    },
+       { SUPPLICANT_INTERFACE, "InterfaceCreated",  signal_interface_added    },
+       { SUPPLICANT_INTERFACE, "InterfaceRemoved",  signal_interface_removed  },
 
        { SUPPLICANT_INTERFACE ".Interface", "BSSAdded",       signal_bss_added       },
        { SUPPLICANT_INTERFACE ".Interface", "BSSRemoved",     signal_bss_removed     },
@@ -1114,3 +1140,51 @@ void supplicant_unregister(const struct supplicant_callbacks *callbacks)
        callbacks_pointer = NULL;
        eap_methods = 0;
 }
+
+static void add_debug_level(DBusMessageIter *iter, void *user_data)
+{
+       dbus_int32_t level = GPOINTER_TO_UINT(user_data);
+       DBusMessageIter entry;
+
+       dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT,
+                                                       NULL, &entry);
+
+       dbus_message_iter_append_basic(&entry, DBUS_TYPE_INT32, &level);
+       dbus_message_iter_append_basic(&entry, DBUS_TYPE_BOOLEAN,
+                                               &debug_show_timestamps);
+       dbus_message_iter_append_basic(&entry, DBUS_TYPE_BOOLEAN,
+                                               &debug_show_keys);
+
+       dbus_message_iter_close_container(iter, &entry);
+}
+
+void supplicant_set_debug_level(unsigned int level)
+{
+       supplicant_dbus_property_set(SUPPLICANT_PATH, SUPPLICANT_INTERFACE,
+                               "DebugParams", "(ibb)",
+                               add_debug_level, GUINT_TO_POINTER(level));
+}
+
+static void add_show_timestamps(DBusMessageIter *iter, void *user_data)
+{
+       dbus_bool_t show_timestamps = GPOINTER_TO_UINT(user_data);
+       DBusMessageIter entry;
+
+       dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT,
+                                                       NULL, &entry);
+
+       dbus_message_iter_append_basic(&entry, DBUS_TYPE_INT32, &debug_level);
+       dbus_message_iter_append_basic(&entry, DBUS_TYPE_BOOLEAN,
+                                                       &show_timestamps);
+       dbus_message_iter_append_basic(&entry, DBUS_TYPE_BOOLEAN,
+                                                       &debug_show_keys);
+
+       dbus_message_iter_close_container(iter, &entry);
+}
+
+void supplicant_set_debug_show_timestamps(dbus_bool_t enabled)
+{
+       supplicant_dbus_property_set(SUPPLICANT_PATH, SUPPLICANT_INTERFACE,
+                               "DebugParams", "(ibb)",
+                               add_show_timestamps, GUINT_TO_POINTER(enabled));
+}
index 3d1b5c1..0a783e1 100644 (file)
@@ -87,3 +87,6 @@ struct supplicant_callbacks {
 
 int supplicant_register(const struct supplicant_callbacks *callbacks);
 void supplicant_unregister(const struct supplicant_callbacks *callbacks);
+
+void supplicant_set_debug_level(unsigned int level);
+void supplicant_set_debug_show_timestamps(dbus_bool_t enabled);