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
nl_cli_addr_alloc(void)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
nl_cli_addr_parse_family(struct rtnl_addr * addr,char * arg)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
nl_cli_addr_parse_local(struct rtnl_addr * addr,char * arg)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
nl_cli_addr_parse_dev(struct rtnl_addr * addr,struct nl_cache * link_cache,char * arg)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
nl_cli_addr_parse_label(struct rtnl_addr * addr,char * arg)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
nl_cli_addr_parse_peer(struct rtnl_addr * addr,char * arg)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
nl_cli_addr_parse_scope(struct rtnl_addr * addr,char * arg)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
nl_cli_addr_parse_broadcast(struct rtnl_addr * addr,char * arg)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
parse_lifetime(const char * arg)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
nl_cli_addr_parse_preferred(struct rtnl_addr * addr,char * arg)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
nl_cli_addr_parse_valid(struct rtnl_addr * addr,char * arg)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 /** @} */
136