libnl
3.2.3
|
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 /** @} */