]> git.ipfire.org Git - thirdparty/iw.git/blob - reg.c
ship nl80211.h
[thirdparty/iw.git] / reg.c
1 #include <net/if.h>
2 #include <errno.h>
3 #include <string.h>
4
5 #include <netlink/genl/genl.h>
6 #include <netlink/genl/family.h>
7 #include <netlink/genl/ctrl.h>
8 #include <netlink/msg.h>
9 #include <netlink/attr.h>
10
11 #include "nl80211.h"
12 #include "iw.h"
13
14 int isalpha_upper(char letter)
15 {
16 if (letter >= 65 && letter <= 90)
17 return 1;
18 return 0;
19 }
20
21 static int is_alpha2(char *alpha2)
22 {
23 if (isalpha_upper(alpha2[0]) && isalpha_upper(alpha2[1]))
24 return 1;
25 return 0;
26 }
27
28 static int is_world_regdom(char *alpha2)
29 {
30 /* ASCII 0 */
31 if (alpha2[0] == 48 && alpha2[1] == 48)
32 return 1;
33 return 0;
34 }
35
36 static int handle_reg_set(struct nl_cb *cb,
37 struct nl_msg *msg,
38 int argc, char **argv)
39 {
40 char alpha2[3];
41
42 if (argc < 1)
43 return 1;
44
45 if (!is_alpha2(argv[0]) && !is_world_regdom(argv[0])) {
46 fprintf(stderr, "not a valid ISO/IEC 3166-1 alpha2\n");
47 fprintf(stderr, "Special non-alpha2 usable entries:\n");
48 fprintf(stderr, "\t00\tWorld Regulatory domain\n");
49 return 2;
50 }
51
52 alpha2[0] = argv[0][0];
53 alpha2[1] = argv[0][1];
54 alpha2[2] = '\0';
55
56 argc--;
57 argv++;
58
59 if (argc)
60 return 1;
61
62 NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2, alpha2);
63
64 return 0;
65 nla_put_failure:
66 return -ENOBUFS;
67 }
68 COMMAND(reg, set, "<ISO/IEC 3166-1 alpha2>",
69 NL80211_CMD_REQ_SET_REG, 0, CIB_NONE, handle_reg_set);