summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThomas Graf <tgr@lsx.localdomain>2008-06-17 02:52:18 +0200
committerThomas Graf <tgr@lsx.localdomain>2008-06-17 02:52:18 +0200
commitab578b9ca00b19ad6b66283ec08d004f9fc391d6 (patch)
tree36c836e67e26e725faea588b4f27256c985185a4 /src
parent1f66555570e58a71ed7975b8d2b22dafc99f8ab8 (diff)
downloadandroid_external_libnl-ab578b9ca00b19ad6b66283ec08d004f9fc391d6.tar.gz
android_external_libnl-ab578b9ca00b19ad6b66283ec08d004f9fc391d6.tar.bz2
android_external_libnl-ab578b9ca00b19ad6b66283ec08d004f9fc391d6.zip
Improvements to address utilities
- Moved env var dumping to nl-addr-list.c - support for ipv6 lifetimes - correct and complete help texts
Diffstat (limited to 'src')
-rw-r--r--src/addr-utils.c24
-rw-r--r--src/addr-utils.h2
-rw-r--r--src/nl-addr-add.c49
-rw-r--r--src/nl-addr-delete.c43
-rw-r--r--src/nl-addr-list.c134
5 files changed, 198 insertions, 54 deletions
diff --git a/src/addr-utils.c b/src/addr-utils.c
index 900be14..3cbe4f4 100644
--- a/src/addr-utils.c
+++ b/src/addr-utils.c
@@ -96,3 +96,27 @@ void parse_broadcast(struct rtnl_addr *addr, char *arg)
nl_addr_put(a);
}
+static uint32_t parse_lifetime(const char *arg)
+{
+ uint64_t msecs;
+ int err;
+
+ if (!strcasecmp(arg, "forever"))
+ return 0xFFFFFFFFU;
+
+ if ((err = nl_str2msec(arg, &msecs)) < 0)
+ fatal(err, "Unable to parse time string \"%s\": %s",
+ arg, nl_geterror(err));
+
+ return (msecs / 1000);
+}
+
+void parse_preferred(struct rtnl_addr *addr, char *arg)
+{
+ rtnl_addr_set_preferred_lifetime(addr, parse_lifetime(arg));
+}
+
+void parse_valid(struct rtnl_addr *addr, char *arg)
+{
+ rtnl_addr_set_valid_lifetime(addr, parse_lifetime(arg));
+}
diff --git a/src/addr-utils.h b/src/addr-utils.h
index 45a9709..5efa07f 100644
--- a/src/addr-utils.h
+++ b/src/addr-utils.h
@@ -22,5 +22,7 @@ extern void parse_label(struct rtnl_addr *, char *);
extern void parse_peer(struct rtnl_addr *, char *);
extern void parse_scope(struct rtnl_addr *, char *);
extern void parse_broadcast(struct rtnl_addr *, char *);
+extern void parse_preferred(struct rtnl_addr *, char *);
+extern void parse_valid(struct rtnl_addr *, char *);
#endif
diff --git a/src/nl-addr-add.c b/src/nl-addr-add.c
index 207989a..74911a6 100644
--- a/src/nl-addr-add.c
+++ b/src/nl-addr-add.c
@@ -15,21 +15,24 @@ static int quiet = 0;
static void print_usage(void)
{
printf(
- "Usage: nl-addr-add [OPTION]... [ADDRESS]\n"
- "\n"
- "Options\n"
- " -q, --quiet Do not print informal notifications\n"
- " -h, --help Show this help\n"
- " -v, --version Show versioning information\n"
- "\n"
- "Address Options\n"
- " -a, --local=ADDR local address, e.g. 10.0.0.1\n"
- " -d, --dev=DEV device the address is on\n"
- " --family=FAMILY address family\n"
- " --label=STRING address label\n"
- " --peer=ADDR peer address\n"
- " --scope=SCOPE address scope\n"
- " --broadcast=ADDR broadcast address\n"
+"Usage: nl-addr-add [OPTION]... [ADDRESS]\n"
+"\n"
+"Options\n"
+" --replace Replace the address if it exists.\n"
+" -q, --quiet Do not print informal notifications.\n"
+" -h, --help Show this help.\n"
+" -v, --version Show versioning information.\n"
+"\n"
+"Address Options\n"
+" -a, --local=ADDR Address to be considered local.\n"
+" -d, --dev=DEV Device the address should be assigned to.\n"
+" --family=FAMILY Address family (normally autodetected).\n"
+" --broadcast=ADDR Broadcast address of network (IPv4).\n"
+" --peer=ADDR Peer address (IPv4).\n"
+" --label=STRING Additional address label (IPv4).\n"
+" --scope=SCOPE Scope of local address (IPv4).\n"
+" --preferred=TIME Preferred lifetime (IPv6).\n"
+" --valid=TIME Valid lifetime (IPv6).\n"
);
exit(0);
@@ -44,7 +47,7 @@ int main(int argc, char *argv[])
.dp_type = NL_DUMP_LINE,
.dp_fd = stdout,
};
- int err;
+ int err, nlflags = NLM_F_CREATE;
sock = nlt_alloc_socket();
nlt_connect(sock, NETLINK_ROUTE);
@@ -59,8 +62,12 @@ int main(int argc, char *argv[])
ARG_PEER,
ARG_SCOPE,
ARG_BROADCAST,
+ ARG_REPLACE,
+ ARG_PREFERRED,
+ ARG_VALID,
};
static struct option long_opts[] = {
+ { "replace", 0, 0, ARG_REPLACE },
{ "quiet", 0, 0, 'q' },
{ "help", 0, 0, 'h' },
{ "version", 0, 0, 'v' },
@@ -71,6 +78,8 @@ int main(int argc, char *argv[])
{ "peer", 1, 0, ARG_PEER },
{ "scope", 1, 0, ARG_SCOPE },
{ "broadcast", 1, 0, ARG_BROADCAST },
+ { "preferred", 1, 0, ARG_PREFERRED },
+ { "valid", 1, 0, ARG_VALID },
{ 0, 0, 0, 0 }
};
@@ -79,6 +88,8 @@ int main(int argc, char *argv[])
break;
switch (c) {
+ case '?': exit(NLE_INVAL);
+ case ARG_REPLACE: nlflags |= NLM_F_REPLACE; break;
case 'q': quiet = 1; break;
case 'h': print_usage(); break;
case 'v': nlt_print_version(); break;
@@ -89,11 +100,13 @@ int main(int argc, char *argv[])
case ARG_PEER: parse_peer(addr, optarg); break;
case ARG_SCOPE: parse_scope(addr, optarg); break;
case ARG_BROADCAST: parse_broadcast(addr, optarg); break;
+ case ARG_PREFERRED: parse_preferred(addr, optarg); break;
+ case ARG_VALID: parse_valid(addr, optarg); break;
}
}
- if ((err = rtnl_addr_add(sock, addr, 0)) < 0)
- fatal(err, "Unable to add address: %s\n", nl_geterror(err));
+ if ((err = rtnl_addr_add(sock, addr, nlflags)) < 0)
+ fatal(err, "Unable to add address: %s", nl_geterror(err));
if (!quiet) {
printf("Added ");
diff --git a/src/nl-addr-delete.c b/src/nl-addr-delete.c
index e7cb0a9..4211191 100644
--- a/src/nl-addr-delete.c
+++ b/src/nl-addr-delete.c
@@ -17,23 +17,26 @@ static int deleted = 0;
static void print_usage(void)
{
printf(
- "Usage: nl-addr-delete [OPTION]... [ADDRESS]\n"
- "\n"
- "Options\n"
- " -i, --interactive Run interactively\n"
- " --yes Set default answer to yes\n"
- " -q, --quiet Do not print informal notifications\n"
- " -h, --help Show this help\n"
- " -v, --version Show versioning information\n"
- "\n"
- "Address Options\n"
- " -a, --local=ADDR local address, e.g. 10.0.0.1\n"
- " -d, --dev=DEV device the address is on\n"
- " --family=FAMILY address family\n"
- " --label=STRING address label\n"
- " --peer=ADDR peer address\n"
- " --scope=SCOPE address scope\n"
- " --broadcast=ADDR broadcast address\n"
+"Usage: nl-addr-delete [OPTION]... [ADDRESS]\n"
+"\n"
+"Options\n"
+" -i, --interactive Run interactively.\n"
+" --yes Set default answer to yes.\n"
+" -q, --quiet Do not print informal notifications.\n"
+" -h, --help Show this help.\n"
+" -v, --version Show versioning information.\n"
+"\n"
+"Address Options\n"
+" -a, --local=ADDR Local address.\n"
+" -d, --dev=DEV Associated network device.\n"
+" --family=FAMILY Family of local address.\n"
+" --label=STRING Address label (IPv4).\n"
+" --peer=ADDR Peer address (IPv4).\n"
+" --scope=SCOPE Address scope (IPv4).\n"
+" --broadcast=ADDR Broadcast address of network (IPv4).\n"
+" --valid-lifetime=TS Valid lifetime before route expires (IPv6).\n"
+" --preferred=TIME Preferred lifetime (IPv6).\n"
+" --valid=TIME Valid lifetime (IPv6).\n"
);
exit(0);
@@ -82,6 +85,8 @@ int main(int argc, char *argv[])
ARG_PEER,
ARG_SCOPE,
ARG_BROADCAST,
+ ARG_PREFERRED,
+ ARG_VALID,
};
static struct option long_opts[] = {
{ "interactive", 0, 0, 'i' },
@@ -96,6 +101,8 @@ int main(int argc, char *argv[])
{ "peer", 1, 0, ARG_PEER },
{ "scope", 1, 0, ARG_SCOPE },
{ "broadcast", 1, 0, ARG_BROADCAST },
+ { "preferred", 1, 0, ARG_PREFERRED },
+ { "valid", 1, 0, ARG_VALID },
{ 0, 0, 0, 0 }
};
@@ -116,6 +123,8 @@ int main(int argc, char *argv[])
case ARG_PEER: parse_peer(addr, optarg); break;
case ARG_SCOPE: parse_scope(addr, optarg); break;
case ARG_BROADCAST: parse_broadcast(addr, optarg); break;
+ case ARG_PREFERRED: parse_preferred(addr, optarg); break;
+ case ARG_VALID: parse_valid(addr, optarg); break;
}
}
diff --git a/src/nl-addr-list.c b/src/nl-addr-list.c
index 7c7806d..0a3fb64 100644
--- a/src/nl-addr-list.c
+++ b/src/nl-addr-list.c
@@ -13,25 +13,99 @@
static void print_usage(void)
{
printf(
- "Usage: nl-addr-list [OPTION]... [ADDRESS]\n"
- "\n"
- "Options\n"
- " -f, --format=TYPE Output format { brief | details | stats }\n"
- " -h, --help Show this help\n"
- " -v, --version Show versioning information\n"
- "\n"
- "Address Options\n"
- " -a, --local=ADDR local address, e.g. 10.0.0.1\n"
- " -d, --dev=DEV device the address is on\n"
- " --family=FAMILY address family\n"
- " --label=STRING address label\n"
- " --peer=ADDR peer address\n"
- " --scope=SCOPE address scope\n"
- " --broadcast=ADDR broadcast address\n"
+"Usage: nl-addr-list [OPTION]... [ADDRESS]\n"
+"\n"
+"Options\n"
+" --details Show details on multiple lines.\n"
+" --env Print address details in sh env variable syntax.\n"
+" --prefix=STRING Prefix each printed line.\n"
+" -h, --help Show this help.\n"
+" -v, --version Show versioning information.\n"
+"\n"
+"Address Selection\n"
+" -a, --local=ADDR Local address.\n"
+" -d, --dev=DEV Associated network device.\n"
+" --family=FAMILY Family of local address.\n"
+" --label=STRING Address label (IPv4).\n"
+" --peer=ADDR Peer address (IPv4).\n"
+" --scope=SCOPE Address scope (IPv4).\n"
+" --broadcast=ADDR Broadcast address of network (IPv4).\n"
+" --valid-lifetime=TS Valid lifetime before route expires (IPv6).\n"
+" --preferred=TIME Preferred lifetime (IPv6).\n"
+" --valid=TIME Valid lifetime (IPv6).\n"
);
exit(0);
}
+static char *prefix;
+
+void print_prefix(struct nl_dump_params *p, int line)
+{
+ if (prefix)
+ nl_dump(p, "%s", prefix);
+}
+
+static void env_dump(struct nl_object *obj, void *arg)
+{
+ struct nl_dump_params *p = arg;
+ struct rtnl_addr *addr = (struct rtnl_addr *) obj;
+ struct nl_cache *link_cache;
+ struct nl_addr *a;
+ static int index = 0;
+ char buf[128], pfx[32], *s;
+
+ snprintf(pfx, sizeof(pfx), "ADDR%d", index++);
+
+ nl_dump_line(p, "%s_FAMILY=%s\n", pfx,
+ nl_af2str(rtnl_addr_get_family(addr), buf, sizeof(buf)));
+
+ nl_dump_line(p, "%s_LOCAL=%s\n", pfx,
+ nl_addr2str(rtnl_addr_get_local(addr), buf, sizeof(buf)));
+
+ nl_dump_line(p, "%s_IFINDEX=%u\n", pfx, rtnl_addr_get_ifindex(addr));
+ link_cache = nl_cache_mngt_require("route/link");
+ if (link_cache)
+ nl_dump_line(p, "%s_IFNAME=%s\n", pfx,
+ rtnl_link_i2name(link_cache,
+ rtnl_addr_get_ifindex(addr),
+ buf, sizeof(buf)));
+
+ if ((a = rtnl_addr_get_peer(addr)))
+ nl_dump_line(p, "%s_PEER=%s\n", pfx,
+ nl_addr2str(a, buf, sizeof(buf)));
+
+ if ((a = rtnl_addr_get_broadcast(addr)))
+ nl_dump_line(p, "%s_BROADCAST=%s\n", pfx,
+ nl_addr2str(a, buf, sizeof(buf)));
+
+ nl_dump_line(p, "%s_SCOPE=%s\n", pfx,
+ rtnl_scope2str(rtnl_addr_get_scope(addr),
+ buf, sizeof(buf)));
+
+ if ((s = rtnl_addr_get_label(addr)))
+ nl_dump_line(p, "%s_LABEL=%s\n", pfx, s);
+
+ rtnl_addr_flags2str(rtnl_addr_get_flags(addr), buf, sizeof(buf));
+ if (buf[0])
+ nl_dump_line(p, "%s_FLAGS=%s\n", pfx, buf);
+
+ nl_dump_line(p, "%s_CACHEINFO_VALID=%u\n", pfx,
+ rtnl_addr_get_valid_lifetime(addr));
+
+#if 0
+ if (addr->ce_mask & ADDR_ATTR_CACHEINFO) {
+ struct rtnl_addr_cacheinfo *ci = &addr->a_cacheinfo;
+
+ nl_dump_line(p, "ADDR_CACHEINFO_PREFERRED=%u\n",
+ ci->aci_prefered);
+
+ nl_dump_line(p, "ADDR_CACHEINFO_CREATED=%u\n", ci->aci_cstamp);
+ nl_dump_line(p, "ADDR_CACHEINFO_LASTUPDATE=%u\n",
+ ci->aci_tstamp);
+ }
+#endif
+}
+
int main(int argc, char *argv[])
{
struct nl_handle *sock;
@@ -39,8 +113,10 @@ int main(int argc, char *argv[])
struct nl_cache *link_cache, *addr_cache;
struct nl_dump_params params = {
.dp_type = NL_DUMP_LINE,
+ .dp_nl_cb = print_prefix,
.dp_fd = stdout,
};
+ int dump_env = 0;
sock = nlt_alloc_socket();
nlt_connect(sock, NETLINK_ROUTE);
@@ -56,9 +132,16 @@ int main(int argc, char *argv[])
ARG_PEER,
ARG_SCOPE,
ARG_BROADCAST,
+ ARG_DETAILS,
+ ARG_ENV,
+ ARG_PREFIX,
+ ARG_PREFERRED,
+ ARG_VALID,
};
static struct option long_opts[] = {
- { "format", 1, 0, 'f' },
+ { "details", 0, 0, ARG_DETAILS },
+ { "env", 0, 0, ARG_ENV },
+ { "prefix", 1, 0, ARG_PREFIX },
{ "help", 0, 0, 'h' },
{ "version", 0, 0, 'v' },
{ "local", 1, 0, 'a' },
@@ -68,15 +151,22 @@ int main(int argc, char *argv[])
{ "peer", 1, 0, ARG_PEER },
{ "scope", 1, 0, ARG_SCOPE },
{ "broadcast", 1, 0, ARG_BROADCAST },
+ { "preferred", 1, 0, ARG_PREFERRED },
+ { "valid", 1, 0, ARG_VALID },
{ 0, 0, 0, 0 }
};
- c = getopt_long(argc, argv, "f:hva:d:", long_opts, &optidx);
+ c = getopt_long(argc, argv, "46hva:d:", long_opts, &optidx);
if (c == -1)
break;
switch (c) {
- case 'f': params.dp_type = nlt_parse_dumptype(optarg); break;
+ case '?': exit(NLE_INVAL);
+ case '4': rtnl_addr_set_family(addr, AF_INET); break;
+ case '6': rtnl_addr_set_family(addr, AF_INET6); break;
+ case ARG_DETAILS: params.dp_type = NL_DUMP_DETAILS; break;
+ case ARG_ENV: dump_env = 1; break;
+ case ARG_PREFIX: prefix = strdup(optarg); break;
case 'h': print_usage(); break;
case 'v': nlt_print_version(); break;
case 'a': parse_local(addr, optarg); break;
@@ -86,10 +176,16 @@ int main(int argc, char *argv[])
case ARG_PEER: parse_peer(addr, optarg); break;
case ARG_SCOPE: parse_scope(addr, optarg); break;
case ARG_BROADCAST: parse_broadcast(addr, optarg); break;
+ case ARG_PREFERRED: parse_preferred(addr, optarg); break;
+ case ARG_VALID: parse_valid(addr, optarg); break;
}
}
- nl_cache_dump_filter(addr_cache, &params, OBJ_CAST(addr));
+ if (dump_env)
+ nl_cache_foreach_filter(addr_cache, OBJ_CAST(addr), env_dump,
+ &params);
+ else
+ nl_cache_dump_filter(addr_cache, &params, OBJ_CAST(addr));
return 0;
}