Mercurial > hg > toybox
annotate toys/pending/rfkill.c @ 1307:8868e482963e draft
rfkill - enable/disable the radio devices
e.g. Wireless adapter, Bluetooth devices...
author | Ashwini Sharma <ak.ashwini1981@gmail.com> |
---|---|
date | Fri, 23 May 2014 09:00:09 -0500 |
parents | |
children | 788c6c097fa2 |
rev | line source |
---|---|
1307
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
1 /* rfkill.c - Enable/disable wireless devices. |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
2 * |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
3 * Copyright 2014 Ranjan Kumar <ranjankumar.bth@gmail.com> |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
4 * Copyright 2014 Kyungwan Han <asura321@gmail.com> |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
5 * |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
6 * No Standard |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
7 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
8 USE_RFKILL(NEWTOY(rfkill, "<1>2", TOYFLAG_SBIN)) |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
9 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
10 config RFKILL |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
11 bool "rfkill" |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
12 default n |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
13 help |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
14 Usage: rfkill COMMAND |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
15 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
16 Enable/disable wireless devices. |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
17 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
18 Commands: |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
19 list [IDENTIFIER] List current state |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
20 block IDENTIFIER Disable device |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
21 unblock IDENTIFIER Enable device |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
22 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
23 where IDENTIFIER is the index no. of an rfkill switch or one of: |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
24 <idx> all, wlan(wifi), bluetooth, uwb(ultrawideband), wimax, wwan, gps, fm. |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
25 */ |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
26 #define FOR_rfkill |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
27 #include "toys.h" |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
28 #include <linux/rfkill.h> |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
29 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
30 struct arglist { |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
31 char *name; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
32 int idx; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
33 }; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
34 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
35 static int getidx(char ***argv, struct arglist *list) |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
36 { |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
37 struct arglist *alist; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
38 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
39 if (!**argv) return -1; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
40 for (alist = list; alist->name; alist++) |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
41 if (!strcmp(**argv, alist->name)) { |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
42 *argv += 1; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
43 return alist->idx; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
44 } |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
45 return -1; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
46 } |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
47 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
48 void rfkill_main(void) |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
49 { |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
50 struct rfkill_event rfevent; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
51 int fd, tvar, idx = -1, tid = RFKILL_TYPE_ALL; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
52 char **optargs = toys.optargs; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
53 struct arglist cmds[] = {{"list", 0}, {"block", 1}, |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
54 {"unblock", 2}, {NULL, -1}}; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
55 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
56 if (((tvar = getidx(&optargs, cmds)) < 0) || ((tvar) && !*optargs)) { |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
57 toys.exithelp = 1; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
58 (tvar < 0) ? error_exit("cmd missmatch") |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
59 : error_exit("%s idx missing", *toys.optargs); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
60 } |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
61 if (*optargs) { |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
62 struct arglist rftypes[] = {{"all", RFKILL_TYPE_ALL}, |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
63 {"wifi", RFKILL_TYPE_WLAN}, {"wlan", RFKILL_TYPE_WLAN}, |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
64 {"bluetooth", RFKILL_TYPE_BLUETOOTH}, {"uwb", RFKILL_TYPE_UWB}, |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
65 {"ultrawideband", RFKILL_TYPE_UWB}, {"wimax", RFKILL_TYPE_WIMAX}, |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
66 {"wwan", RFKILL_TYPE_WWAN}, {"gps", RFKILL_TYPE_GPS}, |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
67 {"fm", 7}, {NULL, -1}}; // RFKILL_TYPE_FM = 7 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
68 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
69 if ((tid = getidx(&optargs, rftypes)) == -1) |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
70 idx = atolx_range(*optargs, 0, INT_MAX); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
71 } |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
72 fd = xcreate("/dev/rfkill", (tvar ? O_RDWR : O_RDONLY)|O_NONBLOCK, 0600); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
73 if (tvar) { |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
74 memset(&rfevent, 0, sizeof(rfevent)); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
75 rfevent.soft = (tvar & 1); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
76 if (tid != -1) { |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
77 rfevent.type = tid; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
78 rfevent.op = RFKILL_OP_CHANGE_ALL; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
79 } else if (idx >= 0) { |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
80 rfevent.idx = idx; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
81 rfevent.op = RFKILL_OP_CHANGE; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
82 } |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
83 xwrite(fd, &rfevent, sizeof(rfevent)); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
84 } else { // show list. |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
85 while (sizeof(rfevent) == readall(fd, &rfevent, sizeof(rfevent))) { |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
86 char *line = NULL, *name = NULL, *type = NULL; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
87 |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
88 // filter of list items. |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
89 if (((tid > 0) && (tid != rfevent.type)) |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
90 || ((idx != -1) && (idx != rfevent.idx))) continue; |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
91 sprintf(toybuf, "/sys/class/rfkill/rfkill%u/uevent", rfevent.idx); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
92 tvar = xopen(toybuf, O_RDONLY); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
93 while ((line = get_line(tvar))) { |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
94 if (!strncmp(line, "RFKILL_NAME", strlen("RFKILL_NAME"))) |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
95 name = xstrdup(strchr(line, '=')+1); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
96 else if (!strncmp(line, "RFKILL_TYPE", strlen("RFKILL_TYPE"))) |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
97 type = xstrdup(strchr(line, '=')+1); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
98 free(line); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
99 } |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
100 xprintf("%u: %s: %s\n", rfevent.idx, name, type); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
101 xprintf("\tSoft blocked: %s\n", rfevent.soft ? "yes" : "no"); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
102 xprintf("\tHard blocked: %s\n", rfevent.hard ? "yes" : "no"); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
103 xclose(tvar); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
104 free(name), free(type); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
105 } |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
106 } |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
107 xclose(fd); |
8868e482963e
rfkill - enable/disable the radio devices
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
108 } |