]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - ip/iptoken.c
Merge branch 'hdrs-for-dump-req' into iproute2-next
[mirror_iproute2.git] / ip / iptoken.c
index 1d22c03c63ab78562621e771930ac557c662a347..8605e75c4edc8d82230d77af8fbb08cf53c492e7 100644 (file)
@@ -13,7 +13,6 @@
 #include <stdlib.h>
 #include <stdbool.h>
 #include <unistd.h>
-#include <syslog.h>
 #include <fcntl.h>
 #include <string.h>
 #include <sys/socket.h>
@@ -26,6 +25,7 @@
 #include "rt_names.h"
 #include "utils.h"
 #include "ip_common.h"
+#include "json_print.h"
 
 extern struct rtnl_handle rth;
 
@@ -38,7 +38,7 @@ static void usage(void) __attribute__((noreturn));
 
 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);
 }
 
@@ -51,7 +51,6 @@ static int print_token(const struct sockaddr_nl *who, struct nlmsghdr *n, void *
        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;
@@ -79,13 +78,17 @@ static int print_token(const struct sockaddr_nl *who, struct nlmsghdr *n, void *
                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;
@@ -94,10 +97,7 @@ static int print_token(const struct sockaddr_nl *who, struct nlmsghdr *n, void *
 static int iptoken_list(int argc, char **argv)
 {
        int af = AF_INET6;
-       struct rtnl_dump_args da;
-
-       memset(&da, 0, sizeof(da));
-       da.fp = stdout;
+       struct rtnl_dump_args da = { .fp = stdout };
 
        while (argc > 0) {
                if (strcmp(*argv, "dev") == 0) {
@@ -109,37 +109,37 @@ static int iptoken_list(int argc, char **argv)
                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;
        }
 
+       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) {
@@ -154,13 +154,7 @@ static int iptoken_set(int argc, char **argv)
                        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;
                        }
                }
@@ -176,7 +170,14 @@ static int iptoken_set(int argc, char **argv)
                return -1;
        }
 
-       if (rtnl_talk(&rth, &req.n, NULL, 0) < 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;
@@ -194,7 +195,9 @@ int do_iptoken(int argc, char **argv)
                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)