Tagging module iproute2 - iproute2-2.6.16-2
[iproute2.git] / ip / rtm_map.c
1 /*
2  * rtm_map.c
3  *
4  *              This program is free software; you can redistribute it and/or
5  *              modify it under the terms of the GNU General Public License
6  *              as published by the Free Software Foundation; either version
7  *              2 of the License, or (at your option) any later version.
8  *
9  * Authors:     Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
10  *
11  */
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <unistd.h>
16 #include <syslog.h>
17 #include <fcntl.h>
18 #include <string.h>
19 #include <sys/socket.h>
20 #include <netinet/in.h>
21
22 #include "rt_names.h"
23 #include "utils.h"
24
25 char *rtnl_rtntype_n2a(int id, char *buf, int len)
26 {
27         switch (id) {
28         case RTN_UNSPEC:
29                 return "none";
30         case RTN_UNICAST:
31                 return "unicast";
32         case RTN_LOCAL:
33                 return "local";
34         case RTN_BROADCAST:
35                 return "broadcast";
36         case RTN_ANYCAST:
37                 return "anycast";
38         case RTN_MULTICAST:
39                 return "multicast";
40         case RTN_BLACKHOLE:
41                 return "blackhole";
42         case RTN_UNREACHABLE:
43                 return "unreachable";
44         case RTN_PROHIBIT:
45                 return "prohibit";
46         case RTN_THROW:
47                 return "throw";
48         case RTN_NAT:
49                 return "nat";
50         case RTN_XRESOLVE:
51                 return "xresolve";
52         default:
53                 snprintf(buf, len, "%d", id);
54                 return buf;
55         }
56 }
57
58
59 int rtnl_rtntype_a2n(int *id, char *arg)
60 {
61         char *end;
62         unsigned long res;
63
64         if (strcmp(arg, "local") == 0)
65                 res = RTN_LOCAL;
66         else if (strcmp(arg, "nat") == 0)
67                 res = RTN_NAT;
68         else if (matches(arg, "broadcast") == 0 ||
69                  strcmp(arg, "brd") == 0)
70                 res = RTN_BROADCAST;
71         else if (matches(arg, "anycast") == 0)
72                 res = RTN_ANYCAST;
73         else if (matches(arg, "multicast") == 0)
74                 res = RTN_MULTICAST;
75         else if (matches(arg, "prohibit") == 0)
76                 res = RTN_PROHIBIT;
77         else if (matches(arg, "unreachable") == 0)
78                 res = RTN_UNREACHABLE;
79         else if (matches(arg, "blackhole") == 0)
80                 res = RTN_BLACKHOLE;
81         else if (matches(arg, "xresolve") == 0)
82                 res = RTN_XRESOLVE;
83         else if (matches(arg, "unicast") == 0)
84                 res = RTN_UNICAST;
85         else if (strcmp(arg, "throw") == 0)
86                 res = RTN_THROW;
87         else {
88                 res = strtoul(arg, &end, 0);
89                 if (!end || end == arg || *end || res > 255)
90                         return -1;
91         }
92         *id = res;
93         return 0;
94 }
95
96 int get_rt_realms(__u32 *realms, char *arg)
97 {
98         __u32 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 }