#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
-#include <syslog.h>
#include <fcntl.h>
#include <string.h>
#include <sys/socket.h>
#include "rt_names.h"
#include "utils.h"
#include "ip_common.h"
+#include "json_print.h"
extern struct rtnl_handle rth;
static void usage(void)
{
- fprintf(stderr, "Usage: ip token [ list | set | get ] [ TOKEN ] [ dev DEV ]\n");
+ fprintf(stderr, "Usage: ip token [ list | set | del | get ] [ TOKEN ] [ dev DEV ]\n");
exit(-1);
}
int len = n->nlmsg_len;
struct rtattr *tb[IFLA_MAX + 1];
struct rtattr *ltb[IFLA_INET6_MAX + 1];
- char abuf[256];
if (n->nlmsg_type != RTM_NEWLINK)
return -1;
return -1;
}
- fprintf(fp, "token %s ",
- format_host(ifi->ifi_family,
- RTA_PAYLOAD(ltb[IFLA_INET6_TOKEN]),
- RTA_DATA(ltb[IFLA_INET6_TOKEN]),
- abuf, sizeof(abuf)));
- fprintf(fp, "dev %s ", ll_index_to_name(ifi->ifi_index));
- fprintf(fp, "\n");
+ open_json_object(NULL);
+ print_string(PRINT_FP, NULL, "token ", NULL);
+ print_color_string(PRINT_ANY,
+ ifa_family_color(ifi->ifi_family),
+ "token", "%s",
+ format_host_rta(ifi->ifi_family, ltb[IFLA_INET6_TOKEN]));
+ print_string(PRINT_FP, NULL, " dev ", NULL);
+ print_color_string(PRINT_ANY, COLOR_IFNAME,
+ "ifname", "%s\n",
+ ll_index_to_name(ifi->ifi_index));
+ close_json_object();
fflush(fp);
return 0;
static int iptoken_list(int argc, char **argv)
{
int af = AF_INET6;
- struct rtnl_dump_args da;
- const struct rtnl_dump_filter_arg a[2] = {
- { .filter = print_token, .arg1 = &da, },
- { .filter = NULL, .arg1 = NULL, },
- };
-
- memset(&da, 0, sizeof(da));
- da.fp = stdout;
+ struct rtnl_dump_args da = { .fp = stdout };
while (argc > 0) {
if (strcmp(*argv, "dev") == 0) {
argc--; argv++;
}
- if (rtnl_wilddump_request(&rth, af, RTM_GETLINK) < 0) {
+ if (rtnl_linkdump_req(&rth, af) < 0) {
perror("Cannot send dump request");
return -1;
}
- if (rtnl_dump_filter_l(&rth, a) < 0) {
+ new_json_obj(json);
+ if (rtnl_dump_filter(&rth, print_token, &da) < 0) {
+ delete_json_obj();
fprintf(stderr, "Dump terminated\n");
return -1;
}
+ delete_json_obj();
return 0;
}
-static int iptoken_set(int argc, char **argv)
+static int iptoken_set(int argc, char **argv, bool delete)
{
struct {
struct nlmsghdr n;
struct ifinfomsg ifi;
char buf[512];
- } req;
+ } req = {
+ .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
+ .n.nlmsg_flags = NLM_F_REQUEST,
+ .n.nlmsg_type = RTM_SETLINK,
+ .ifi.ifi_family = AF_INET6,
+ };
struct rtattr *afs, *afs6;
- bool have_token = false, have_dev = false;
- inet_prefix addr;
-
- memset(&addr, 0, sizeof(addr));
- memset(&req, 0, sizeof(req));
-
- req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
- req.n.nlmsg_flags = NLM_F_REQUEST;
- req.n.nlmsg_type = RTM_SETLINK;
- req.ifi.ifi_family = AF_INET6;
+ bool have_token = delete, have_dev = false;
+ inet_prefix addr = { .bytelen = 16, };
while (argc > 0) {
if (strcmp(*argv, "dev") == 0) {
if (matches(*argv, "help") == 0)
usage();
if (!have_token) {
- afs = addattr_nest(&req.n, sizeof(req), IFLA_AF_SPEC);
- afs6 = addattr_nest(&req.n, sizeof(req), AF_INET6);
get_prefix(&addr, *argv, req.ifi.ifi_family);
- addattr_l(&req.n, sizeof(req), IFLA_INET6_TOKEN,
- &addr.data, addr.bytelen);
- addattr_nest_end(&req.n, afs6);
- addattr_nest_end(&req.n, afs);
have_token = true;
}
}
}
if (!have_token) {
- fprintf(stderr, "Not enough information: token "
- "is required.\n");
+ fprintf(stderr, "Not enough information: token is required.\n");
return -1;
}
if (!have_dev) {
- fprintf(stderr, "Not enough information: \"dev\" "
- "argument is required.\n");
+ fprintf(stderr, "Not enough information: \"dev\" argument is required.\n");
return -1;
}
- if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0)
+ afs = addattr_nest(&req.n, sizeof(req), IFLA_AF_SPEC);
+ afs6 = addattr_nest(&req.n, sizeof(req), AF_INET6);
+ addattr_l(&req.n, sizeof(req), IFLA_INET6_TOKEN,
+ &addr.data, addr.bytelen);
+ addattr_nest_end(&req.n, afs6);
+ addattr_nest_end(&req.n, afs);
+
+ if (rtnl_talk(&rth, &req.n, NULL) < 0)
return -2;
return 0;
return iptoken_list(argc - 1, argv + 1);
} else if (matches(argv[0], "set") == 0 ||
matches(argv[0], "add") == 0) {
- return iptoken_set(argc - 1, argv + 1);
+ return iptoken_set(argc - 1, argv + 1, false);
+ } else if (matches(argv[0], "delete") == 0) {
+ return iptoken_set(argc - 1, argv + 1, true);
} else if (matches(argv[0], "get") == 0) {
return iptoken_list(argc - 1, argv + 1);
} else if (matches(argv[0], "help") == 0)