Re: [PATCH] device: Don’t report EALREADY if enabling device succeeds with ifup
On Mon, 2015-03-16 at 12:58 +0200, Patrik Flykt wrote: > On Fri, 2015-03-13 at 08:31 +0000, Philip Withnall wrote: > > $ connmanctl disable ethernet > > Disabled ethernet > > $ connmanctl technologies > > /net/connman/technology/ethernet > > Powered = False > > … > > $ connmanctl enable ethernet > > Error ethernet: Already enabled > > Did anything special happen between checking that the Powered status was > False and enabling it again? Did 'monitor technologies' show Powered > changing state in between? Nope, nothing changed in between. > > --- > > src/device.c | 15 ++- > > 1 file changed, 10 insertions(+), 5 deletions(-) > > > > diff --git a/src/device.c b/src/device.c > > index c0683ab..c9e9b8b 100644 > > --- a/src/device.c > > +++ b/src/device.c > > @@ -168,7 +168,7 @@ static gboolean device_pending_reset(gpointer user_data) > > > > int __connman_device_enable(struct connman_device *device) > > { > > - int err; > > + int err, index_err = -EOPNOTSUPP; > > > > DBG("device %p", device); > > > > @@ -186,9 +186,9 @@ int __connman_device_enable(struct connman_device > > *device) > > return -EALREADY; > > > > if (device->index > 0) { > > - err = connman_inet_ifup(device->index); > > - if (err < 0 && err != -EALREADY) > > - return err; > > + index_err = connman_inet_ifup(device->index); > > + if (index_err < 0 && index_err != -EALREADY) > > + return index_err; > > } > > > > device->powered_pending = PENDING_ENABLE; > > @@ -197,9 +197,14 @@ int __connman_device_enable(struct connman_device > > *device) > > /* > > * device gets enabled right away. > > * Invoke the callback > > +* > > +* If device->driver->enable() returned EALREADY but the earlier > > +* connman_inet_ifup() call did not, then the interface came up > > +* with the earlier call and we should not report an error. > > */ > > - if (err == 0) { > > + if (err == 0 || (err == -EALREADY && index_err == 0)) { > > connman_device_set_powered(device, true); > > + err = 0; > > goto done; > > } > > This check is a bit too low in the stack. In device.c it is ok to report > -EALREADY for situations that are already in the state they're attempted > to be set to. > > There are actually two bugs in technology.c. > > The first bug is in technology_enable(), once past the statement 'if > (technology->enabled)...' there is no reason to reply with -EALREADY. > For some reason ConnMan's powered property doesn't reflect the reality > correctly, but it does not really matter as being a cause for -EALREADY. > So the first fix is to set err to zero in case of an -EALREADY from > either __connman_rfkill_block() or technology_affect_devices() before > returning. > > The second bug is in technology_affect_devices(). Only when all affected > devices report an error should technology_affect_devices() return an > error, not the result from the device that happens to be the last one in > the list and fail as is happening now. > > An then an additional bug is in technology_disable(), it does the same > thing wrong as technology_enable()... Whew, right. I am unlikely to find time to work on this until one or three weeks from now, but I have put it on my backlog to look at as soon as I can after then. Sorry! Philip signature.asc Description: This is a digitally signed message part ___ connman mailing list connman@connman.net https://lists.connman.net/mailman/listinfo/connman
[PATCH] device: Don’t report EALREADY if enabling device succeeds with ifup
If a device is indexed (for example, a wired ethernet connection), it can be successfully enabled by calling connman_inet_ifup(). This means that the call to device->driver->enable() lower down in __connman_device_enable() will fail with EALREADY. Squash that error, since the overall operation has been a success. This can be reproduced on a system with a wired connection using connmanctl: $ connmanctl technologies /net/connman/technology/ethernet Name = Wired Type = ethernet Powered = True Connected = True Tethering = False $ connmanctl disable ethernet Disabled ethernet $ connmanctl technologies /net/connman/technology/ethernet Powered = False … $ connmanctl enable ethernet Error ethernet: Already enabled With the patch applied, the final call succeeds as expected. --- src/device.c | 15 ++- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/device.c b/src/device.c index c0683ab..c9e9b8b 100644 --- a/src/device.c +++ b/src/device.c @@ -168,7 +168,7 @@ static gboolean device_pending_reset(gpointer user_data) int __connman_device_enable(struct connman_device *device) { - int err; + int err, index_err = -EOPNOTSUPP; DBG("device %p", device); @@ -186,9 +186,9 @@ int __connman_device_enable(struct connman_device *device) return -EALREADY; if (device->index > 0) { - err = connman_inet_ifup(device->index); - if (err < 0 && err != -EALREADY) - return err; + index_err = connman_inet_ifup(device->index); + if (index_err < 0 && index_err != -EALREADY) + return index_err; } device->powered_pending = PENDING_ENABLE; @@ -197,9 +197,14 @@ int __connman_device_enable(struct connman_device *device) /* * device gets enabled right away. * Invoke the callback +* +* If device->driver->enable() returned EALREADY but the earlier +* connman_inet_ifup() call did not, then the interface came up +* with the earlier call and we should not report an error. */ - if (err == 0) { + if (err == 0 || (err == -EALREADY && index_err == 0)) { connman_device_set_powered(device, true); + err = 0; goto done; } -- 1.9.3 signature.asc Description: This is a digitally signed message part ___ connman mailing list connman@connman.net https://lists.connman.net/mailman/listinfo/connman
[PATCH] plugins: Fix polkit policy defaults to use current allow values
The *_session variants of the policy default allow values were removed in 2007: http://lists.freedesktop.org/archives/hal-commit/2007-August/003690.html Instead of auth_self_keep_session, use auth_self_keep. Similarly for auth_admin_keep_session. This fixes parsing the default policy with any recent version of polkit — tested with version 0.105. Previously, I believe polkit aborted parsing the policy and hence never added the actions to its action pool for use in rule files or authorisations. --- plugins/polkit.policy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/polkit.policy b/plugins/polkit.policy index 0c2629a..0de152c 100644 --- a/plugins/polkit.policy +++ b/plugins/polkit.policy @@ -13,7 +13,7 @@ Policy prevents modification of settings no - auth_self_keep_session + auth_self_keep @@ -22,7 +22,7 @@ Policy prevents modification of secrets no - auth_admin_keep_session + auth_admin_keep -- 1.9.3 signature.asc Description: This is a digitally signed message part ___ connman mailing list connman@connman.net https://lists.connman.net/mailman/listinfo/connman