summaryrefslogtreecommitdiff
path: root/src/nm-keep-alive.c
Commit message (Collapse)AuthorAgeFilesLines
* all: SPDX header conversionLubomir Rintel2019-09-101-15/+1
| | | | | $ find * -type f |xargs perl contrib/scripts/spdx.pl $ git rm contrib/scripts/spdx.pl
* core: add and use nm_keep_alive_destroy()Thomas Haller2019-06-271-0/+20
| | | | | | | | | | | When we are done with a NMKeepAlive instance, we always should do three things: - unset the owner - disarm (freeze) the keep-alive - give up our reference. Add and use nm_keep_alive_destroy() that does this.
* all: use nm_clear_g_dbus_connection_signal() helperThomas Haller2019-05-121-1/+1
| | | | | | | | | I also like this because it's non-obvious that subscription IDs from GDBusConnection are "guint" (contrary to signal handler IDs which are "gulong"). So, by using this API you get a compiler error when using the wrong type. In the past, when switching to nm_clear_g_signal_handler() this uncovered multiple bugs where the wrong type was used to hold the ID.
* all: use nm_dbus_connection_signal_subscribe_name_owner_changed()Thomas Haller2019-05-121-41/+23
| | | | ... and nm_dbus_connection_call_get_name_owner().
* all: drop unnecessary includes of <errno.h> and <string.h>Thomas Haller2019-02-121-2/+0
| | | | | "nm-macros-interal.h" already includes <errno.h> and <string.h>. No need to include it everywhere else too.
* all: fix misspellingsRafael Fontenelle2019-01-241-2/+2
| | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/64
* keep-alive: only declare keep-alive dead when connection becomes invisibleThomas Haller2018-12-091-7/+32
| | | | | | | | | | | | | A user can always manually activate his/her own profile, even if the profile is currently is invisible. -- it could be invisible, because the profile has "connection.permissions" set but the user has no active session. Now, if the user should be able to activate such a profile, then it cannot fail simply because being invisible all along. Instead, the alive check must only fail, if a connection becomes invisible that was visible in the time since it is monitored.
* keep-alive: default keep-alive instance to aliveThomas Haller2018-12-091-13/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | NMKeepAlive supports conditions (watches, bindings) that determine whether the instance signals alive state. Currently, there are two conditions: watch a VISIBLE state of a connection and watch whether a D-Bus client is registered. Anyway, if none of these conditions are enabled, then the default should be that the instance is alive. If one or more conditions are enabled, then they cooprate in a particular way, depending on whether the condition is enabled and whether it is satisfied. Previously, the code couldn't differenciate whether a D-Bus watch was not enabled or whether the D-Bus client already disconnected. It would just check whether priv->dbus_client was set, but that alone was not sufficient to differentiate. That means, we couldn't determine whether the keep-alive instance is alive (by default, as no D-Bus watch is enabled) or whether the keep-alive instance is dead (because the D-Bus client disconnected). Fix that, by tracking explicitly whether to watch based on a priv->dbus_client_watching flag. Note, that problems by this were avoided earlier, by only arming the instance when enabling a condition. But I think the concept of arming the keep-alive instance merely means that the instance is ready to fire events. It should not mean that the user only arms the instance after registering a condition. Also, without this, we couldn't unbind the NMKeepAlive instance from all conditions, without making it dead right away. Unbinding/disabling all conditions should render the instance alive, not dead.
* keep-alive: log alive/dead status of keep-alive instanceThomas Haller2018-12-091-0/+1
|
* keep-alive: drop unused nm_keep_alive_set_forced()Thomas Haller2018-12-091-17/+0
| | | | | | | | | | | | | | | | | | | | | | set-forced is currently unused, so drop it. NMKeepAlive in principle determines the alive-status based on multiple aspects, that in combination render the instance alive or dead. These aspects cooperate in a particular way. By default, a keep-alive instance should be alive. If there are conditions enabled that further determine the alive-state, then these conditions cooperate in a particular way. As it was, the force-flag would just overrule them all. But is that useful? The nm_keep_alive_set_forced() API also means that only one user caller can have control over the flag. Independent callers cannot cooperate on setting the flag, because there is no reference-counting or registered handles. At least today, it's unclear whether this flag really should overrule all other conditions and how this flag would actually be used. Drop it for now.
* keep-alive: let NMKeepAlive instance access the owner object that it is ↵Thomas Haller2018-12-091-0/+60
| | | | | | | | | | | | | | | | keeping alive NMKeepAlive is a full API independent of NMActiveConnection. For good reasons: - it moves complexity away from nm-active-connection.c - in the future, we can use NMKeepAlive also for NMSettingsConnection As such, the user should also directly interact with NMKeepAlive, instead of going through NMActiveConnection. For that to work, it must be possible to get the owner of the NMKeepAlive instance, which is kept alive.
* keep-alive: rename nm_keep_alive_sink() to nm_keep_alive_arm()Thomas Haller2018-12-091-15/+33
| | | | | | | | | | | | The names "floating" and "sink()" are well known and good. However, "disarm()" seems the best name for the counterpart operation, better than "float()", "unsink()", or "freeze()". Since we have "nm_keep_alive_disarm()", for consitency rename - "floating" -> (not) "armed" - "sink()" -> "arm()"
* keep-alive: drop "floating" argument from nm_keep_alive_new()Thomas Haller2018-12-091-9/+8
| | | | | | | | | All callers only want to create floating instances at first. Also, it seems to make generally more sense this way: you create a floating instance, set it up, and then arm it. This simplifies nm_keep_alive_new(), which previously was adding additional code that wasn't accessible via plain g_object_new().
* keep-alive: add nm_keep_alive_disarm() to silence notifications once we ↵Thomas Haller2018-12-091-4/+40
| | | | | | | | | | | | | | | | | | disconnect The NMKeepAlive instance is useful to find out when we should disconnect. The moment when we start disconnecting, we don't care about it anymore. Add a nm_keep_alive_disarm() function to suppress property change events about the alive state, after that point. Emitting further events from that point on is only confusing. Yes, this means, a NMKeepAlive instance shall not be re-used for multiple purposes. Create a separate keep-alive instace for each target that should be guarded. Also, once disarmed, we can release all resources that the NMKeepAlive instance was holding until now.
* keep-alive: check GetNameOwner lazy and only when we rely on the informationThomas Haller2018-11-201-15/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Upside: - it may avoid a D-Bus call altogether. - currently there is no API to bind/unbind an existing NMActiveConnection, it can only be bound initially with AddAndActivate2. That makes sense when the calling applicatiion only wants to keep the profile active for as long as it lives. It never intends to extend the lifetime beyond that. In such a case, it is expected that eventually we need to be sure whether the D-Bus client is still alive, as we make a decision based on that. In that case, we eventually will call GetNameOwner and nothing is saved. A future feature could add D-Bus API to bind/unbind existing active connections after creation. That would allow an application to activate profiles and -- if anything goes wrong -- to be sure that the profile gets deactivted. Only in the success case, it would unbind the lifetime in a last step and terminate. Un such a case, binding to a D-Bus client is more of a fail-safe mechanism and commonly not expected to come into action. This is an interesting feature, because ActivateConnection D-Bus call may take a long time, while perfroming interactive polkit authentication. That means, `nmcli connection up $PROFILE` can fail with timeout before the active connection path is even created, but afterwards the profile may still succeed to activate. That seems wrong. nmcli could avoid that, by binding the active connection to itself, and when nmcli exits with failure, it would make sure that the active connection gets disconnected as well. Downside: - the code is slightly more complicated(?). - if the D-Bus name is indeed gone (but the NMKeepAlive is still alive for other reasons), we will not unregister the D-Bus signal, because we never learn that it's gone. It's not a leak, but an unnecessary signal subscription. - during nm_keep_alive_set_dbus_client_watch() we don't notice right away that the D-Bus client is already gone. That is unavoidable as we confirm the state asynchronously. If the NMKeepAlive is kept alive for other reasons but only later depends on presence of the D-Bus client, then in the non-lazy approach we would have noticed already that the client is gone, and would disconnect right away. With the lazy approach, this takes another async D-Bus call to notice.
* keep-alive: avoid race with with D-Bus client disconnecting earlyBenjamin Berg2018-11-191-2/+54
| | | | | | | | | | | When we subscribe the signal fo NameOwnerChanged, we are not sure that the name-owner is currently alive. Issue a GetNameOwner call to make sure. Co-authored-by: Thomas Haller <thaller@redhat.com> Fixes: 37e8c53eeed579fe34a68819cd12f3295d581394
* keep-alive: minor cleanup of nm_keep_alive_set_dbus_client_watch()Thomas Haller2018-11-171-20/+26
| | | | | | | | | - always issue a _notify_alive(), just to be sure. At least in case where we clear a dbus-client watch, the alive state could change. - avoid the logging in cleanup_dbus_watch(), if there is nothing to cleanup.
* keep-alive: cleanup tracking visible state of connectionThomas Haller2018-11-171-12/+29
| | | | | | | | | | | | | | | | | - in nm_keep_alive_set_settings_connection_watch_visible(), abort early when setting the same connection again (or %NULL again). - nm_keep_alive_set_settings_connection_watch_visible() would (already before) correctly disconnect the signal handler from the previous connection. As we anyway do explict disconnects, avoid the overhead of a weak pointer with g_signal_connect_object(). Just reuse the same setter to disconnect the signal in dispose(). - fix leaking priv->connection in nm_keep_alive_set_settings_connection_watch_visible(). - use g_signal_handlers_disconnect_by_func(), to be more specific about which signal we want to disconnect.
* keep-alive: cache the alive-state and only emit the signal when it changedThomas Haller2018-11-171-15/+39
| | | | | | | | The alive state is composed from various parts, let's only emit a _notify (self, PROP_ALIVE) when it actually changes. For that, cache the alive state and let _notify_alive() determine whether it changed and possibly emit the signal.
* keep-alive: various style fixesThomas Haller2018-11-171-30/+46
| | | | | | | | | | Some trivial changes: - move nm_keep_alive_new() after nm_keep_alive_init(), so that the functions that initialize the instance are beside each other. - prefer nm_streq*() over strcmp(). - wrap some lines. - remove some empty lines.
* keep-alive: drop unused error argumentThomas Haller2018-11-171-4/+3
|
* core: Introduce helper class to track connection keep aliveBenjamin Berg2018-11-171-0/+251
For P2P connections it makes sense to bind the connection to the status of the operation that is being done. One example is that a wifi display (miracast) P2P connection should be shut down when streaming fails for some reason. This new helper class allows binding a connection to the presence of a DBus path meaning that it will be torn down if the process disappears.