Tizen 2.1 base
[platform/upstream/libnl2.git] / src / lib / addr.c
1 /*
2  * src/lib/addr.c     Address Helpers
3  *
4  *      This library is free software; you can redistribute it and/or
5  *      modify it under the terms of the GNU Lesser General Public
6  *      License as published by the Free Software Foundation version 2.1
7  *      of the License.
8  *
9  * Copyright (c) 2008-2009 Thomas Graf <tgraf@suug.ch>
10  */
11
12 /**
13  * @ingroup cli
14  * @defgroup cli_addr Addresses
15  *
16  * @{
17  */
18
19 #include <netlink/cli/utils.h>
20 #include <netlink/cli/addr.h>
21
22 struct rtnl_addr *nl_cli_addr_alloc(void)
23 {
24         struct rtnl_addr *addr;
25
26         addr = rtnl_addr_alloc();
27         if (!addr)
28                 nl_cli_fatal(ENOMEM, "Unable to allocate address object");
29
30         return addr;
31 }
32
33 void nl_cli_addr_parse_family(struct rtnl_addr *addr, char *arg)
34 {
35         int family;
36
37         if ((family = nl_str2af(arg)) != AF_UNSPEC)
38                 rtnl_addr_set_family(addr, family);
39 }
40
41 void nl_cli_addr_parse_local(struct rtnl_addr *addr, char *arg)
42 {
43         struct nl_addr *a;
44         int err;
45
46         a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr));
47         if ((err = rtnl_addr_set_local(addr, a)) < 0)
48                 nl_cli_fatal(err, "Unable to set local address: %s",
49                              nl_geterror(err));
50
51         nl_addr_put(a);
52 }
53
54 void nl_cli_addr_parse_dev(struct rtnl_addr *addr, struct nl_cache *link_cache,
55                            char *arg)
56 {
57         int ival;
58
59         if (!(ival = rtnl_link_name2i(link_cache, arg)))
60                 nl_cli_fatal(ENOENT, "Link \"%s\" does not exist", arg);
61
62         rtnl_addr_set_ifindex(addr, ival);
63 }
64
65 void nl_cli_addr_parse_label(struct rtnl_addr *addr, char *arg)
66 {
67         int err;
68
69         if ((err = rtnl_addr_set_label(addr, arg)) < 0)
70                 nl_cli_fatal(err, "Unable to set address label: %s",
71                              nl_geterror(err));
72 }
73
74 void nl_cli_addr_parse_peer(struct rtnl_addr *addr, char *arg)
75 {
76         struct nl_addr *a;
77         int err;
78
79         a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr));
80         if ((err = rtnl_addr_set_peer(addr, a)) < 0)
81                 nl_cli_fatal(err, "Unable to set peer address: %s",
82                              nl_geterror(err));
83
84         nl_addr_put(a);
85 }
86
87 void nl_cli_addr_parse_scope(struct rtnl_addr *addr, char *arg)
88 {
89         int ival;
90
91         if ((ival = rtnl_str2scope(arg)) < 0)
92                 nl_cli_fatal(EINVAL, "Unknown address scope \"%s\"", arg);
93
94         rtnl_addr_set_scope(addr, ival);
95 }
96
97 void nl_cli_addr_parse_broadcast(struct rtnl_addr *addr, char *arg)
98 {
99         struct nl_addr *a;
100         int err;
101
102         a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr));
103         if ((err = rtnl_addr_set_broadcast(addr, a)) < 0)
104                 nl_cli_fatal(err, "Unable to set broadcast address: %s",
105                              nl_geterror(err));
106
107         nl_addr_put(a);
108 }
109
110 static uint32_t parse_lifetime(const char *arg)
111 {
112         uint64_t msecs;
113         int err;
114
115         if (!strcasecmp(arg, "forever"))
116                 return 0xFFFFFFFFU;
117
118         if ((err = nl_str2msec(arg, &msecs)) < 0)
119                 nl_cli_fatal(err, "Unable to parse time string \"%s\": %s",
120                              arg, nl_geterror(err));
121
122         return (msecs / 1000);
123 }
124
125 void nl_cli_addr_parse_preferred(struct rtnl_addr *addr, char *arg)
126 {
127         rtnl_addr_set_preferred_lifetime(addr, parse_lifetime(arg));
128 }
129
130 void nl_cli_addr_parse_valid(struct rtnl_addr *addr, char *arg)
131 {
132         rtnl_addr_set_valid_lifetime(addr, parse_lifetime(arg));
133 }
134
135 /** @} */