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