From 03ccc454b737760f607cca8adf96fd8e94df2e24 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Mon, 27 Jan 2020 14:28:08 -0600 Subject: [PATCH] knownneetworks: React to mtime updates We track mtime as the 'LastConnectedTime' of the network, and also sort the known network list according to the last connected time. Unfortunately we were never reacting to ATTRIB changes, and so were never updating the network_info->connected_time whenever a network was connected to. Rework the logic to address this. This also fixes a small bug where the connected_time was not set properly prior to removal / re-insertion of the network_info. --- src/hotspot.c | 14 ++++++++++++- src/knownnetworks.c | 48 ++++++++++++++++++++++++++++----------------- src/knownnetworks.h | 3 ++- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/hotspot.c b/src/hotspot.c index e0252753..0db42eb0 100644 --- a/src/hotspot.c +++ b/src/hotspot.c @@ -460,12 +460,24 @@ static void hs20_dir_watch_cb(const char *filename, return; } - known_network_update(&config->super, new, connected_time); + known_network_set_connected_time(&config->super, + connected_time); + known_network_update(&config->super, new); l_settings_free(new); break; case L_DIR_WATCH_EVENT_ACCESSED: + break; + case L_DIR_WATCH_EVENT_ATTRIB: + config = l_queue_find(hs20_settings, match_filename, full_path); + if (!config) + return; + + connected_time = l_path_get_mtime(full_path); + known_network_set_connected_time(&config->super, + connected_time); + break; } } diff --git a/src/knownnetworks.c b/src/knownnetworks.c index 6022e9c1..53cfc30f 100644 --- a/src/knownnetworks.c +++ b/src/knownnetworks.c @@ -335,26 +335,29 @@ bool network_info_match_nai_realm(const struct network_info *info, return info->ops->match_nai_realms(info, nai_realms); } -void known_network_update(struct network_info *network, - struct l_settings *settings, +void known_network_set_connected_time(struct network_info *network, uint64_t connected_time) +{ + if (network->connected_time == connected_time) + return; + + network->connected_time = connected_time; + + l_dbus_property_changed(dbus_get_bus(), + known_network_get_path(network), + IWD_KNOWN_NETWORK_INTERFACE, + "LastConnectedTime"); + + l_queue_remove(known_networks, network); + l_queue_insert(known_networks, network, connected_time_compare, NULL); +} + +void known_network_update(struct network_info *network, + struct l_settings *settings) { bool is_hidden; bool is_autoconnectable; - if (network->connected_time != connected_time) { - l_dbus_property_changed(dbus_get_bus(), - known_network_get_path(network), - IWD_KNOWN_NETWORK_INTERFACE, - "LastConnectedTime"); - - l_queue_remove(known_networks, network); - l_queue_insert(known_networks, network, connected_time_compare, - NULL); - } - - network->connected_time = connected_time; - if (!l_settings_get_bool(settings, "Settings", "Hidden", &is_hidden)) is_hidden = false; @@ -753,10 +756,11 @@ static void known_networks_watch_cb(const char *filename, if (settings) { connected_time = l_path_get_mtime(full_path); - if (network_before) - known_network_update(network_before, settings, + if (network_before) { + known_network_set_connected_time(network_before, connected_time); - else + known_network_update(network_before, settings); + } else known_network_new(ssid, security, settings, connected_time); } else if (network_before) @@ -766,6 +770,14 @@ static void known_networks_watch_cb(const char *filename, break; case L_DIR_WATCH_EVENT_ACCESSED: + break; + case L_DIR_WATCH_EVENT_ATTRIB: + if (network_before) { + connected_time = l_path_get_mtime(full_path); + known_network_set_connected_time(network_before, + connected_time); + } + break; } } diff --git a/src/knownnetworks.h b/src/knownnetworks.h index 12008cae..0d03dd59 100644 --- a/src/knownnetworks.h +++ b/src/knownnetworks.h @@ -125,6 +125,7 @@ bool network_info_match_nai_realm(const struct network_info *info, void known_networks_add(struct network_info *info); void known_network_update(struct network_info *info, - struct l_settings *settings, + struct l_settings *settings); +void known_network_set_connected_time(struct network_info *network, uint64_t connected_time); void known_networks_remove(struct network_info *info);