diff options
-rw-r--r-- | examples/Makefile.am | 6 | ||||
-rw-r--r-- | examples/nft-set-parse-add.c (renamed from examples/nft-set-json-add.c) | 75 |
2 files changed, 52 insertions, 29 deletions
diff --git a/examples/Makefile.am b/examples/Makefile.am index 2559f5c..fafcb76 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -15,7 +15,7 @@ check_PROGRAMS = nft-table-add \ nft-rule-get \ nft-events \ nft-set-add \ - nft-set-json-add \ + nft-set-parse-add \ nft-set-get \ nft-set-del \ nft-set-elem-add \ @@ -69,8 +69,8 @@ nft_events_LDADD = ../src/libnftnl.la ${LIBMNL_LIBS} nft_set_add_SOURCES = nft-set-add.c nft_set_add_LDADD = ../src/libnftnl.la ${LIBMNL_LIBS} -nft_set_json_add_SOURCES = nft-set-json-add.c -nft_set_json_add_LDADD = ../src/libnftnl.la ${LIBMNL_LIBS} +nft_set_parse_add_SOURCES = nft-set-parse-add.c +nft_set_parse_add_LDADD = ../src/libnftnl.la ${LIBMNL_LIBS} nft_set_del_SOURCES = nft-set-del.c nft_set_del_LDADD = ../src/libnftnl.la ${LIBMNL_LIBS} diff --git a/examples/nft-set-json-add.c b/examples/nft-set-parse-add.c index a4535da..b74ad7f 100644 --- a/examples/nft-set-json-add.c +++ b/examples/nft-set-parse-add.c @@ -27,57 +27,81 @@ #include <libmnl/libmnl.h> #include <libnftnl/set.h> -int main(int argc, char *argv[]) +static struct nft_set *set_parse_file(const char *file, uint16_t format) { - struct mnl_socket *nl; - char buf[MNL_SOCKET_BUFFER_SIZE]; - struct nlmsghdr *nlh; - uint32_t portid, seq; + int fd; struct nft_set *s; - int ret, fd; - uint16_t family; - char json[4096]; - char reprint[4096]; struct nft_parse_err *err; - - if (argc < 2) { - printf("Usage: %s <json-file>\n", argv[0]); - exit(EXIT_FAILURE); - } + char data[4096]; s = nft_set_alloc(); if (s == NULL) { perror("OOM"); - exit(EXIT_FAILURE); + return NULL; } - fd = open(argv[1], O_RDONLY); + fd = open(file, O_RDONLY); if (fd < 0) { perror("open"); - exit(EXIT_FAILURE); + return NULL; } - if (read(fd, json, sizeof(json)) < 0) { + if (read(fd, data, sizeof(data)) < 0) { perror("read"); close(fd); - exit(EXIT_FAILURE); + return NULL; } + close(fd); err = nft_parse_err_alloc(); if (err == NULL) { perror("error"); - exit(EXIT_FAILURE); + return NULL; } - close(fd); + if (nft_set_parse(s, format, data, err) < 0) { + nft_parse_perror("Unable to parse file", err); + nft_parse_err_free(err); + return NULL; + } + + nft_parse_err_free(err); + return s; - if (nft_set_parse(s, NFT_PARSE_JSON, json, err) < 0) { - nft_parse_perror("Unable to parse JSON file", err); +} + +int main(int argc, char *argv[]) +{ + struct mnl_socket *nl; + char buf[MNL_SOCKET_BUFFER_SIZE]; + struct nlmsghdr *nlh; + uint32_t portid, seq; + struct nft_set *s; + int ret; + uint16_t family, format, outformat; + + if (argc < 2) { + printf("Usage: %s {xml|json} <file>\n", argv[0]); + exit(EXIT_FAILURE); + } + + if (strcmp(argv[1], "xml") == 0) { + format = NFT_PARSE_XML; + outformat = NFT_OUTPUT_XML; + } else if (strcmp(argv[1], "json") == 0) { + format = NFT_PARSE_JSON; + outformat = NFT_OUTPUT_JSON; + } else { + printf("Unknown format: xml, json\n"); exit(EXIT_FAILURE); } - nft_set_snprintf(reprint, sizeof(reprint), s, NFT_OUTPUT_JSON, 0); - printf("Parsed:\n%s\n", reprint); + s = set_parse_file(argv[2], format); + if (s == NULL) + exit(EXIT_FAILURE); + + nft_set_fprintf(stdout, s, outformat, 0); + fprintf(stdout, "\n"); family = nft_set_attr_get_u32(s, NFT_SET_ATTR_FAMILY); @@ -87,7 +111,6 @@ int main(int argc, char *argv[]) NLM_F_CREATE|NLM_F_ACK, seq); nft_set_nlmsg_build_payload(nlh, s); nft_set_free(s); - nft_parse_err_free(err); nl = mnl_socket_open(NETLINK_NETFILTER); if (nl == NULL) { |