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
22struct 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
33void 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
41void 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
54void 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
65void 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
74void 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
87void 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
97void 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
110static 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
125void nl_cli_addr_parse_preferred(struct rtnl_addr *addr, char *arg)
126{
127	rtnl_addr_set_preferred_lifetime(addr, parse_lifetime(arg));
128}
129
130void 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