diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2009-07-10 15:41:39 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-07-21 12:07:37 -0400 |
commit | f54c142725ad2ba33c3ee627873cb6966bf05447 (patch) | |
tree | 4bd86d879222e94c5ee175355242b8a04990334b /net | |
parent | e2e414d92397c366396d13f627a98a20be92e509 (diff) |
rfkill: allow toggling soft state in sysfs again
Apparently there actually _are_ tools that try to set
this in sysfs even though it wasn't supposed to be used
this way without claiming first. Guess what: now that
I've cleaned it all up it doesn't matter and we can
simply allow setting the soft-block state in sysfs.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Tested-By: Darren Salt <linux@youmustbejoking.demon.co.uk>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/rfkill/core.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/net/rfkill/core.c b/net/rfkill/core.c index 79693fe2001e..6896c0b45b4a 100644 --- a/net/rfkill/core.c +++ b/net/rfkill/core.c | |||
@@ -648,15 +648,26 @@ static ssize_t rfkill_state_store(struct device *dev, | |||
648 | struct device_attribute *attr, | 648 | struct device_attribute *attr, |
649 | const char *buf, size_t count) | 649 | const char *buf, size_t count) |
650 | { | 650 | { |
651 | /* | 651 | struct rfkill *rfkill = to_rfkill(dev); |
652 | * The intention was that userspace can only take control over | 652 | unsigned long state; |
653 | * a given device when/if rfkill-input doesn't control it due | 653 | int err; |
654 | * to user_claim. Since user_claim is currently unsupported, | 654 | |
655 | * we never support changing the state from userspace -- this | 655 | if (!capable(CAP_NET_ADMIN)) |
656 | * can be implemented again later. | 656 | return -EPERM; |
657 | */ | 657 | |
658 | err = strict_strtoul(buf, 0, &state); | ||
659 | if (err) | ||
660 | return err; | ||
661 | |||
662 | if (state != RFKILL_USER_STATE_SOFT_BLOCKED && | ||
663 | state != RFKILL_USER_STATE_UNBLOCKED) | ||
664 | return -EINVAL; | ||
665 | |||
666 | mutex_lock(&rfkill_global_mutex); | ||
667 | rfkill_set_block(rfkill, state == RFKILL_USER_STATE_SOFT_BLOCKED); | ||
668 | mutex_unlock(&rfkill_global_mutex); | ||
658 | 669 | ||
659 | return -EPERM; | 670 | return err ?: count; |
660 | } | 671 | } |
661 | 672 | ||
662 | static ssize_t rfkill_claim_show(struct device *dev, | 673 | static ssize_t rfkill_claim_show(struct device *dev, |