X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Frfkill.c;h=77c5b92cf1f54666b3be3a80d69b2f33eee7668d;hb=57156cc5738cfbf60e1b0ddf444ad6eec5964a0d;hp=2a4458b8cbbbca309db37c011946f0f0dd34f45d;hpb=a1e76ec36320b976e88ddb19c8da6396ee272446;p=framework%2Fconnectivity%2Fconnman.git diff --git a/src/rfkill.c b/src/rfkill.c index 2a4458b..77c5b92 100644 --- a/src/rfkill.c +++ b/src/rfkill.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2007-2010 Intel Corporation. All rights reserved. + * Copyright (C) 2007-2012 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -23,6 +23,7 @@ #include #endif +#define _GNU_SOURCE #include #include #include @@ -41,6 +42,7 @@ enum rfkill_type { RFKILL_TYPE_WWAN, RFKILL_TYPE_GPS, RFKILL_TYPE_FM, + NUM_RFKILL_TYPES, }; enum rfkill_operation { @@ -74,6 +76,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]; @@ -99,18 +125,19 @@ static GIOStatus rfkill_process(GIOChannel *chan) event->type, event->op, event->soft, event->hard); + type = convert_type(event->type); + switch (event->op) { case RFKILL_OP_ADD: - type = convert_type(event->type); __connman_technology_add_rfkill(event->idx, type, event->soft, event->hard); break; case RFKILL_OP_DEL: - __connman_technology_remove_rfkill(event->idx); + __connman_technology_remove_rfkill(event->idx, type); break; case RFKILL_OP_CHANGE: - __connman_technology_update_rfkill(event->idx, event->soft, - event->hard); + __connman_technology_update_rfkill(event->idx, type, + event->soft, event->hard); break; default: break; @@ -133,6 +160,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 | O_CLOEXEC); + 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; @@ -140,7 +198,7 @@ int __connman_rfkill_init(void) DBG(""); - fd = open("/dev/rfkill", O_RDWR); + fd = open("/dev/rfkill", O_RDWR | O_CLOEXEC); if (fd < 0) { connman_error("Failed to open RFKILL control device"); return -EIO;