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