@@ -31,20 +31,22 @@
#include "admin.h"
#define _GNU_SOURCE
+static DBusConnection *dbus_conn;
+static GList *admin_proxies;
static GDBusProxy *set_proxy;
static GDBusProxy *status_proxy;
-void admin_policy_set_set_proxy(GDBusProxy *proxy)
+static void admin_policy_set_set_proxy(GDBusProxy *proxy)
{
set_proxy = proxy;
}
-void admin_policy_set_status_proxy(GDBusProxy *proxy)
+static void admin_policy_set_status_proxy(GDBusProxy *proxy)
{
status_proxy = proxy;
}
-void admin_policy_read_service_allowlist(DBusConnection *dbus_conn)
+static void admin_policy_read_service_allowlist(DBusConnection *dbus_conn)
{
DBusMessageIter iter, subiter;
char *uuid = NULL;
@@ -111,8 +113,7 @@ static void set_service_reply(DBusMessage *message, void *user_data)
return bt_shell_noninteractive_quit(EXIT_FAILURE);
}
-void admin_policy_set_service_allowlist(DBusConnection *dbus_connd,
- int argc, char *argv[])
+static void admin_policy_set_service_allowlist(int argc, char *argv[])
{
struct uuid_list_data data;
@@ -131,3 +132,89 @@ void admin_policy_set_service_allowlist(DBusConnection *dbus_connd,
return bt_shell_noninteractive_quit(EXIT_FAILURE);
}
}
+
+static void cmd_admin_allow(int argc, char *argv[])
+{
+ if (argc <= 1) {
+ admin_policy_read_service_allowlist(dbus_conn);
+ return;
+ }
+
+ if (strcmp(argv[1], "clear") == 0)
+ argc--;
+
+ admin_policy_set_service_allowlist(argc - 1, argv + 1);
+}
+
+static const struct bt_shell_menu admin_menu = {
+ .name = "admin",
+ .desc = "Admin Policy Submenu",
+ .entries = {
+ { "allow", "[clear/uuid1 uuid2 ...]", cmd_admin_allow,
+ "Allow service UUIDs and block rest of them"},
+ {} },
+};
+
+static void admin_policy_status_added(GDBusProxy *proxy)
+{
+ admin_proxies = g_list_append(admin_proxies, proxy);
+ admin_policy_set_status_proxy(proxy);
+}
+
+static void proxy_added(GDBusProxy *proxy, void *user_data)
+{
+ const char *interface;
+
+ interface = g_dbus_proxy_get_interface(proxy);
+
+ if (!strcmp(interface, "org.bluez.AdminPolicySet1"))
+ admin_policy_set_set_proxy(proxy);
+ else if (!strcmp(interface, "org.bluez.AdminPolicyStatus1"))
+ admin_policy_status_added(proxy);
+}
+
+static void admin_policy_status_removed(GDBusProxy *proxy)
+{
+ admin_proxies = g_list_remove(admin_proxies, proxy);
+ admin_policy_set_status_proxy(NULL);
+}
+
+static void proxy_removed(GDBusProxy *proxy, void *user_data)
+{
+ const char *interface;
+
+ interface = g_dbus_proxy_get_interface(proxy);
+
+ if (!strcmp(interface, "org.bluez.AdminPolicySet1"))
+ admin_policy_set_set_proxy(NULL);
+ else if (!strcmp(interface, "org.bluez.AdminPolicyStatus1"))
+ admin_policy_status_removed(proxy);
+}
+
+static GDBusClient *client;
+
+static void disconnect_handler(DBusConnection *connection, void *user_data)
+{
+ g_list_free_full(admin_proxies, NULL);
+ admin_proxies = NULL;
+}
+
+void admin_add_submenu(void)
+{
+ bt_shell_add_submenu(&admin_menu);
+
+ dbus_conn = bt_shell_get_env("DBUS_CONNECTION");
+ if (!dbus_conn || client)
+ return;
+
+ client = g_dbus_client_new(dbus_conn, "org.bluez", "/org/bluez");
+ g_dbus_client_set_proxy_handlers(client, proxy_added, proxy_removed,
+ NULL, NULL);
+ g_dbus_client_set_disconnect_watch(client, disconnect_handler, NULL);
+}
+
+void admin_remove_submenu(void)
+{
+ g_dbus_client_unref(client);
+ client = NULL;
+}
@@ -17,9 +17,5 @@
*
*/
-void admin_policy_set_set_proxy(GDBusProxy *proxy);
-void admin_policy_set_status_proxy(GDBusProxy *proxy);
-
-void admin_policy_read_service_allowlist(DBusConnection *dbus_conn);
-void admin_policy_set_service_allowlist(DBusConnection *dbus_conn,
- int argc, char *argv[]);
+void admin_add_submenu(void);
+void admin_remove_submenu(void);
@@ -57,7 +57,6 @@ static GDBusProxy *default_dev;
static GDBusProxy *default_attr;
static GList *ctrl_list;
static GList *battery_proxies;
-static GList *admin_devices_proxies;
static const char *agent_arguments[] = {
"on",
@@ -563,26 +562,6 @@ static void admon_manager_added(GDBusProxy *proxy)
adv_monitor_register_app(dbus_conn);
}
-static void admin_policy_set_added(GDBusProxy *proxy)
-{
- admin_policy_set_set_proxy(proxy);
-}
-
-static void admin_policy_status_added(GDBusProxy *proxy)
-{
- struct adapter *adapter;
-
- adapter = find_ctrl(ctrl_list, g_dbus_proxy_get_path(proxy));
-
- if (!adapter) {
- admin_devices_proxies = g_list_append(admin_devices_proxies,
- proxy);
- return;
- }
-
- admin_policy_set_status_proxy(proxy);
-}
-
static void proxy_added(GDBusProxy *proxy, void *user_data)
{
const char *interface;
@@ -618,10 +597,6 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
} else if (!strcmp(interface,
"org.bluez.AdvertisementMonitorManager1")) {
admon_manager_added(proxy);
- } else if (!strcmp(interface, "org.bluez.AdminPolicySet1")) {
- admin_policy_set_added(proxy);
- } else if (!strcmp(interface, "org.bluez.AdminPolicyStatus1")) {
- admin_policy_status_added(proxy);
}
}
@@ -678,26 +653,6 @@ static void adapter_removed(GDBusProxy *proxy)
}
}
-static void admin_policy_set_removed(GDBusProxy *proxy)
-{
- admin_policy_set_set_proxy(NULL);
-}
-
-static void admin_policy_status_removed(GDBusProxy *proxy)
-{
- struct adapter *adapter;
-
- adapter = find_ctrl(ctrl_list, g_dbus_proxy_get_path(proxy));
-
- if (!adapter) {
- admin_devices_proxies = g_list_remove(admin_devices_proxies,
- proxy);
- return;
- }
-
- admin_policy_set_status_proxy(NULL);
-}
-
static void proxy_removed(GDBusProxy *proxy, void *user_data)
{
const char *interface;
@@ -738,10 +693,6 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data)
} else if (!strcmp(interface,
"org.bluez.AdvertisementMonitorManager1")) {
adv_monitor_remove_manager(dbus_conn);
- } else if (!strcmp(interface, "org.bluez.AdminPolicySet1")) {
- admin_policy_set_removed(proxy);
- } else if (!strcmp(interface, "org.bluez.AdminPolicyStatus1")) {
- admin_policy_status_removed(proxy);
}
}
@@ -1772,7 +1723,6 @@ static struct GDBusProxy *find_device(int argc, char *argv[])
static void cmd_info(int argc, char *argv[])
{
GDBusProxy *proxy;
- GDBusProxy *admin_proxy;
GDBusProxy *battery_proxy;
DBusMessageIter iter;
const char *address;
@@ -1819,12 +1769,8 @@ static void cmd_info(int argc, char *argv[])
battery_proxy = find_proxies_by_path(battery_proxies,
g_dbus_proxy_get_path(proxy));
- admin_proxy = find_proxies_by_path(admin_devices_proxies,
- g_dbus_proxy_get_path(proxy));
print_property_with_label(battery_proxy, "Percentage",
"Battery Percentage");
- print_property_with_label(admin_proxy, "AffectedByPolicy",
- "Affected by Policy");
return bt_shell_noninteractive_quit(EXIT_SUCCESS);
}
@@ -2948,22 +2894,6 @@ static void cmd_adv_monitor_get_supported_info(int argc, char *argv[])
adv_monitor_get_supported_info();
}
-static void cmd_admin_allow(int argc, char *argv[])
-{
- if (check_default_ctrl() == FALSE)
- return bt_shell_noninteractive_quit(EXIT_FAILURE);
-
- if (argc <= 1) {
- admin_policy_read_service_allowlist(dbus_conn);
- return;
- }
-
- if (strcmp(argv[1], "clear") == 0)
- argc--;
-
- admin_policy_set_service_allowlist(dbus_conn, argc - 1, argv + 1);
-}
-
static const struct bt_shell_menu advertise_menu = {
.name = "advertise",
.desc = "Advertise Options Submenu",
@@ -3118,15 +3048,6 @@ static const struct bt_shell_menu gatt_menu = {
{ } },
};
-static const struct bt_shell_menu admin_menu = {
- .name = "admin",
- .desc = "Admin Policy Submenu",
- .entries = {
- { "allow", "[clear/uuid1 uuid2 ...]", cmd_admin_allow,
- "Allow service UUIDs and block rest of them"},
- {} },
-};
-
static const struct bt_shell_menu main_menu = {
.name = "main",
.entries = {
@@ -3225,7 +3146,6 @@ int main(int argc, char *argv[])
bt_shell_add_submenu(&advertise_monitor_menu);
bt_shell_add_submenu(&scan_menu);
bt_shell_add_submenu(&gatt_menu);
- bt_shell_add_submenu(&admin_menu);
bt_shell_set_prompt(PROMPT_OFF);
if (agent_option)
@@ -3238,6 +3158,7 @@ int main(int argc, char *argv[])
bt_shell_set_env("DBUS_CONNECTION", dbus_conn);
+ admin_add_submenu();
player_add_submenu();
client = g_dbus_client_new(dbus_conn, "org.bluez", "/org/bluez");
@@ -3253,6 +3174,7 @@ int main(int argc, char *argv[])
status = bt_shell_run();
+ admin_remove_submenu();
player_remove_submenu();
g_dbus_client_unref(client);
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> This moves admin submenu to admin.c so it is not mixed up with other submenus code. --- client/admin.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++--- client/admin.h | 8 ++--- client/main.c | 82 ++---------------------------------------- 3 files changed, 96 insertions(+), 91 deletions(-)