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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }