diff options
author | Alok Barsode <alok.barsode@linux.intel.com> | 2011-08-24 16:44:17 +0300 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2011-08-25 11:14:22 +0200 |
commit | 02a2af243c0c1db909e8aee7ac8bddb0fcdcdcb7 (patch) | |
tree | deb8de8abc266aab7a63caad4b70984ca734289e /src/rfkill.c | |
parent | bdf2640d2d020331efa7975f52ffa5378ae451fc (diff) | |
download | connman-02a2af243c0c1db909e8aee7ac8bddb0fcdcdcb7.tar.gz connman-02a2af243c0c1db909e8aee7ac8bddb0fcdcdcb7.tar.bz2 connman-02a2af243c0c1db909e8aee7ac8bddb0fcdcdcb7.zip |
rfkill: Add technology soft blocking API
Diffstat (limited to 'src/rfkill.c')
-rw-r--r-- | src/rfkill.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/rfkill.c b/src/rfkill.c index 3d214ef3..17592da9 100644 --- a/src/rfkill.c +++ b/src/rfkill.c @@ -41,6 +41,7 @@ enum rfkill_type { RFKILL_TYPE_WWAN, RFKILL_TYPE_GPS, RFKILL_TYPE_FM, + NUM_RFKILL_TYPES, }; enum rfkill_operation { @@ -74,6 +75,30 @@ static enum connman_service_type convert_type(uint8_t type) return CONNMAN_SERVICE_TYPE_UNKNOWN; } +static enum rfkill_type convert_service_type(enum connman_service_type type) +{ + switch (type) { + case CONNMAN_SERVICE_TYPE_WIFI: + return RFKILL_TYPE_WLAN; + case CONNMAN_SERVICE_TYPE_BLUETOOTH: + return RFKILL_TYPE_BLUETOOTH; + case CONNMAN_SERVICE_TYPE_WIMAX: + return RFKILL_TYPE_WIMAX; + case CONNMAN_SERVICE_TYPE_CELLULAR: + return RFKILL_TYPE_WWAN; + case CONNMAN_SERVICE_TYPE_GPS: + return RFKILL_TYPE_GPS; + case CONNMAN_SERVICE_TYPE_SYSTEM: + case CONNMAN_SERVICE_TYPE_ETHERNET: + case CONNMAN_SERVICE_TYPE_VPN: + case CONNMAN_SERVICE_TYPE_GADGET: + case CONNMAN_SERVICE_TYPE_UNKNOWN: + return NUM_RFKILL_TYPES; + } + + return NUM_RFKILL_TYPES; +} + static GIOStatus rfkill_process(GIOChannel *chan) { unsigned char buf[32]; @@ -134,6 +159,37 @@ static gboolean rfkill_event(GIOChannel *chan, static GIOChannel *channel = NULL; +int __connman_rfkill_block(enum connman_service_type type, connman_bool_t block) +{ + uint8_t rfkill_type; + struct rfkill_event event; + ssize_t len; + int fd; + + DBG("type %d block %d", type, block); + + rfkill_type = convert_service_type(type); + if (rfkill_type == NUM_RFKILL_TYPES) + return -EINVAL; + + fd = open("/dev/rfkill", O_RDWR); + if (fd < 0) + return fd; + + memset(&event, 0, sizeof(event)); + event.op = RFKILL_OP_CHANGE_ALL; + event.type = rfkill_type; + event.soft = block; + + len = write(fd, &event, sizeof(event)); + if (len < 0) + connman_error("Failed to change RFKILL state"); + + close(fd); + + return 0; +} + int __connman_rfkill_init(void) { GIOFlags flags; |