addr.c

00001 /*
00002  * src/lib/addr.c     Address Helpers
00003  *
00004  *      This library is free software; you can redistribute it and/or
00005  *      modify it under the terms of the GNU Lesser General Public
00006  *      License as published by the Free Software Foundation version 2.1
00007  *      of the License.
00008  *
00009  * Copyright (c) 2008-2009 Thomas Graf <tgraf@suug.ch>
00010  */
00011 
00012 /**
00013  * @ingroup cli
00014  * @defgroup cli_addr Addresses
00015  *
00016  * @{
00017  */
00018 
00019 #include <netlink/cli/utils.h>
00020 #include <netlink/cli/addr.h>
00021 
00022 struct rtnl_addr *nl_cli_addr_alloc(void)
00023 {
00024         struct rtnl_addr *addr;
00025 
00026         addr = rtnl_addr_alloc();
00027         if (!addr)
00028                 nl_cli_fatal(ENOMEM, "Unable to allocate address object");
00029 
00030         return addr;
00031 }
00032 
00033 void nl_cli_addr_parse_family(struct rtnl_addr *addr, char *arg)
00034 {
00035         int family;
00036 
00037         if ((family = nl_str2af(arg)) != AF_UNSPEC)
00038                 rtnl_addr_set_family(addr, family);
00039 }
00040 
00041 void nl_cli_addr_parse_local(struct rtnl_addr *addr, char *arg)
00042 {
00043         struct nl_addr *a;
00044         int err;
00045 
00046         a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr));
00047         if ((err = rtnl_addr_set_local(addr, a)) < 0)
00048                 nl_cli_fatal(err, "Unable to set local address: %s",
00049                              nl_geterror(err));
00050 
00051         nl_addr_put(a);
00052 }
00053 
00054 void nl_cli_addr_parse_dev(struct rtnl_addr *addr, struct nl_cache *link_cache,
00055                            char *arg)
00056 {
00057         int ival;
00058 
00059         if (!(ival = rtnl_link_name2i(link_cache, arg)))
00060                 nl_cli_fatal(ENOENT, "Link \"%s\" does not exist", arg);
00061 
00062         rtnl_addr_set_ifindex(addr, ival);
00063 }
00064 
00065 void nl_cli_addr_parse_label(struct rtnl_addr *addr, char *arg)
00066 {
00067         int err;
00068 
00069         if ((err = rtnl_addr_set_label(addr, arg)) < 0)
00070                 nl_cli_fatal(err, "Unable to set address label: %s",
00071                              nl_geterror(err));
00072 }
00073 
00074 void nl_cli_addr_parse_peer(struct rtnl_addr *addr, char *arg)
00075 {
00076         struct nl_addr *a;
00077         int err;
00078 
00079         a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr));
00080         if ((err = rtnl_addr_set_peer(addr, a)) < 0)
00081                 nl_cli_fatal(err, "Unable to set peer address: %s",
00082                              nl_geterror(err));
00083 
00084         nl_addr_put(a);
00085 }
00086 
00087 void nl_cli_addr_parse_scope(struct rtnl_addr *addr, char *arg)
00088 {
00089         int ival;
00090 
00091         if ((ival = rtnl_str2scope(arg)) < 0)
00092                 nl_cli_fatal(EINVAL, "Unknown address scope \"%s\"", arg);
00093 
00094         rtnl_addr_set_scope(addr, ival);
00095 }
00096 
00097 void nl_cli_addr_parse_broadcast(struct rtnl_addr *addr, char *arg)
00098 {
00099         struct nl_addr *a;
00100         int err;
00101 
00102         a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr));
00103         if ((err = rtnl_addr_set_broadcast(addr, a)) < 0)
00104                 nl_cli_fatal(err, "Unable to set broadcast address: %s",
00105                              nl_geterror(err));
00106 
00107         nl_addr_put(a);
00108 }
00109 
00110 static uint32_t parse_lifetime(const char *arg)
00111 {
00112         uint64_t msecs;
00113         int err;
00114 
00115         if (!strcasecmp(arg, "forever"))
00116                 return 0xFFFFFFFFU;
00117 
00118         if ((err = nl_str2msec(arg, &msecs)) < 0)
00119                 nl_cli_fatal(err, "Unable to parse time string \"%s\": %s",
00120                              arg, nl_geterror(err));
00121 
00122         return (msecs / 1000);
00123 }
00124 
00125 void nl_cli_addr_parse_preferred(struct rtnl_addr *addr, char *arg)
00126 {
00127         rtnl_addr_set_preferred_lifetime(addr, parse_lifetime(arg));
00128 }
00129 
00130 void nl_cli_addr_parse_valid(struct rtnl_addr *addr, char *arg)
00131 {
00132         rtnl_addr_set_valid_lifetime(addr, parse_lifetime(arg));
00133 }
00134 
00135 /** @} */