rfkill: Add support for reacting to radio kill switch events.

In order for this to work, the correct rfkill index must be specified
with the rfkill-idx option.

It might be possible to auto-detect the corresponding rfkill-idx option,
but I'm not sure if there's a guaranteed mapping between rfkill name and
interface name, as it seems that rfkills should represent phy devices
and not wlan devices.

The rfkill indexes can be found by checking
/sys/class/rfkill/rfkill<IDX>.
This commit is contained in:
Nicholas J. Kain
2015-02-13 16:25:36 -05:00
parent 3421f0c585
commit e3d4d4c1aa
6 changed files with 161 additions and 4 deletions

View File

@ -71,6 +71,7 @@
#include "ifchd.h"
#include "duiaid.h"
#include "sockd.h"
#include "rfkill.h"
struct client_state_t cs = {
.ifchWorking = 0,
@ -82,6 +83,7 @@ struct client_state_t cs = {
.arpFd = -1,
.nlFd = -1,
.nlPortId = -1,
.rfkillFd = -1,
.routerArp = "\0\0\0\0\0\0",
.serverArp = "\0\0\0\0\0\0",
};
@ -275,7 +277,7 @@ static void handle_ifch_message(void)
cs.ifchWorking = 0;
}
#define NDHC_NUM_EP_FDS 7
#define NDHC_NUM_EP_FDS 8
static void do_ndhc_work(void)
{
struct epoll_event events[NDHC_NUM_EP_FDS];
@ -295,6 +297,8 @@ static void do_ndhc_work(void)
epoll_add(cs.epollFd, ifchSock[0]);
epoll_add(cs.epollFd, ifchStream[0]);
epoll_add(cs.epollFd, sockdStream[0]);
if (client_config.enable_rfkill && cs.rfkillFd != -1)
epoll_add(cs.epollFd, cs.nlFd);
start_dhcp_listen(&cs);
nowts = curms();
goto jumpstart;
@ -330,6 +334,9 @@ static void do_ndhc_work(void)
} else if (fd == sockdStream[0]) {
if (events[i].events & (EPOLLHUP|EPOLLERR|EPOLLRDHUP))
exit(EXIT_FAILURE);
} else if (fd == cs.rfkillFd && client_config.enable_rfkill) {
if (events[i].events & EPOLLIN)
handle_rfkill_notice(&cs, client_config.rfkillIdx);
} else
suicide("epoll_wait: unknown fd");
}
@ -429,6 +436,8 @@ static void ndhc_main(void) {
if ((cs.nlFd = nl_open(NETLINK_ROUTE, RTMGRP_LINK, &cs.nlPortId)) < 0)
suicide("%s: failed to open netlink socket", __func__);
cs.rfkillFd = rfkill_open(&client_config.enable_rfkill);
if (client_config.foreground && !client_config.background_if_no_lease) {
if (file_exists(pidfile, "w") < 0)
suicide("%s: can't open pidfile '%s' for write!",