00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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