blob: 3bab53baf2eb4e4c13e802a868acd6fab680c8f8
1 | /* vi: set sw=4 ts=4: */ |
2 | /* |
3 | * This program is free software; you can redistribute it and/or |
4 | * modify it under the terms of the GNU General Public License |
5 | * as published by the Free Software Foundation; either version |
6 | * 2 of the License, or (at your option) any later version. |
7 | * |
8 | * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> |
9 | */ |
10 | |
11 | #include "libbb.h" |
12 | #include "rt_names.h" |
13 | #include "utils.h" |
14 | |
15 | const char* FAST_FUNC rtnl_rtntype_n2a(int id, char *buf) |
16 | { |
17 | switch (id) { |
18 | case RTN_UNSPEC: |
19 | return "none"; |
20 | case RTN_UNICAST: |
21 | return "unicast"; |
22 | case RTN_LOCAL: |
23 | return "local"; |
24 | case RTN_BROADCAST: |
25 | return "broadcast"; |
26 | case RTN_ANYCAST: |
27 | return "anycast"; |
28 | case RTN_MULTICAST: |
29 | return "multicast"; |
30 | case RTN_BLACKHOLE: |
31 | return "blackhole"; |
32 | case RTN_UNREACHABLE: |
33 | return "unreachable"; |
34 | case RTN_PROHIBIT: |
35 | return "prohibit"; |
36 | case RTN_THROW: |
37 | return "throw"; |
38 | case RTN_NAT: |
39 | return "nat"; |
40 | case RTN_XRESOLVE: |
41 | return "xresolve"; |
42 | default: |
43 | /* buf is SPRINT_BSIZE big */ |
44 | sprintf(buf, "%d", id); |
45 | return buf; |
46 | } |
47 | } |
48 | |
49 | |
50 | int FAST_FUNC rtnl_rtntype_a2n(int *id, char *arg) |
51 | { |
52 | static const char keywords[] ALIGN1 = |
53 | "local\0""nat\0""broadcast\0""brd\0""anycast\0" |
54 | "multicast\0""prohibit\0""unreachable\0""blackhole\0" |
55 | "xresolve\0""unicast\0""throw\0"; |
56 | enum { |
57 | ARG_local = 1, ARG_nat, ARG_broadcast, ARG_brd, ARG_anycast, |
58 | ARG_multicast, ARG_prohibit, ARG_unreachable, ARG_blackhole, |
59 | ARG_xresolve, ARG_unicast, ARG_throw |
60 | }; |
61 | const smalluint key = index_in_substrings(keywords, arg) + 1; |
62 | char *end; |
63 | unsigned long res; |
64 | |
65 | if (key == ARG_local) |
66 | res = RTN_LOCAL; |
67 | else if (key == ARG_nat) |
68 | res = RTN_NAT; |
69 | else if (key == ARG_broadcast || key == ARG_brd) |
70 | res = RTN_BROADCAST; |
71 | else if (key == ARG_anycast) |
72 | res = RTN_ANYCAST; |
73 | else if (key == ARG_multicast) |
74 | res = RTN_MULTICAST; |
75 | else if (key == ARG_prohibit) |
76 | res = RTN_PROHIBIT; |
77 | else if (key == ARG_unreachable) |
78 | res = RTN_UNREACHABLE; |
79 | else if (key == ARG_blackhole) |
80 | res = RTN_BLACKHOLE; |
81 | else if (key == ARG_xresolve) |
82 | res = RTN_XRESOLVE; |
83 | else if (key == ARG_unicast) |
84 | res = RTN_UNICAST; |
85 | else if (key == ARG_throw) |
86 | res = RTN_THROW; |
87 | else { |
88 | res = strtoul(arg, &end, 0); |
89 | if (end == arg || *end || res > 255) |
90 | return -1; |
91 | } |
92 | *id = res; |
93 | return 0; |
94 | } |
95 | |
96 | int FAST_FUNC get_rt_realms(uint32_t *realms, char *arg) |
97 | { |
98 | uint32_t realm = 0; |
99 | char *p = strchr(arg, '/'); |
100 | |
101 | *realms = 0; |
102 | if (p) { |
103 | *p = 0; |
104 | if (rtnl_rtrealm_a2n(realms, arg)) { |
105 | *p = '/'; |
106 | return -1; |
107 | } |
108 | *realms <<= 16; |
109 | *p = '/'; |
110 | arg = p+1; |
111 | } |
112 | if (*arg && rtnl_rtrealm_a2n(&realm, arg)) |
113 | return -1; |
114 | *realms |= realm; |
115 | return 0; |
116 | } |
117 |