]>
Commit | Line | Data |
---|---|---|
14a0380d LR |
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 | ||
f408e01b | 11 | #include "nl80211.h" |
14a0380d LR |
12 | #include "iw.h" |
13 | ||
14a0380d LR |
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 | ||
70391ccf | 36 | static int handle_reg_set(struct nl_cb *cb, |
1c05c109 JB |
37 | struct nl_msg *msg, |
38 | int argc, char **argv) | |
14a0380d | 39 | { |
14a0380d LR |
40 | char alpha2[3]; |
41 | ||
1c05c109 | 42 | if (argc < 1) |
5e75fd04 | 43 | return 1; |
14a0380d LR |
44 | |
45 | if (!is_alpha2(argv[0]) && !is_world_regdom(argv[0])) { | |
46 | fprintf(stderr, "not a valid ISO/IEC 3166-1 alpha2\n"); | |
40ffa988 | 47 | fprintf(stderr, "Special non-alpha2 usable entries:\n"); |
14a0380d | 48 | fprintf(stderr, "\t00\tWorld Regulatory domain\n"); |
5e75fd04 | 49 | return 2; |
14a0380d LR |
50 | } |
51 | ||
52 | alpha2[0] = argv[0][0]; | |
53 | alpha2[1] = argv[0][1]; | |
54 | alpha2[2] = '\0'; | |
55 | ||
56 | argc--; | |
57 | argv++; | |
58 | ||
1c05c109 | 59 | if (argc) |
5e75fd04 | 60 | return 1; |
14a0380d LR |
61 | |
62 | NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2, alpha2); | |
63 | ||
70391ccf | 64 | return 0; |
14a0380d | 65 | nla_put_failure: |
70391ccf | 66 | return -ENOBUFS; |
14a0380d | 67 | } |
1c05c109 JB |
68 | COMMAND(reg, set, "<ISO/IEC 3166-1 alpha2>", |
69 | NL80211_CMD_REQ_SET_REG, 0, CIB_NONE, handle_reg_set); |