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);