11 #include <sys/socket.h>
12 #include <linux/netlink.h>
13 #include <linux/netfilter/nfnetlink.h>
15 #include <libmnl/libmnl.h>
16 #include <libnftnl/common.h>
20 struct nlmsghdr *nft_nlmsg_build_hdr(
char *buf, uint16_t cmd, uint16_t family,
21 uint16_t type, uint32_t seq)
26 nlh = mnl_nlmsg_put_header(buf);
27 nlh->nlmsg_type = (NFNL_SUBSYS_NFTABLES << 8) | cmd;
28 nlh->nlmsg_flags = NLM_F_REQUEST | type;
31 nfh = mnl_nlmsg_put_extra_header(nlh,
sizeof(
struct nfgenmsg));
32 nfh->nfgen_family = family;
33 nfh->version = NFNETLINK_V0;
38 EXPORT_SYMBOL(nft_nlmsg_build_hdr);
40 struct nft_parse_err *nft_parse_err_alloc(
void)
42 return calloc(1,
sizeof(
struct nft_parse_err));
44 EXPORT_SYMBOL(nft_parse_err_alloc);
46 void nft_parse_err_free(
struct nft_parse_err *err)
50 EXPORT_SYMBOL(nft_parse_err_free);
52 int nft_parse_perror(
const char *msg,
struct nft_parse_err *err)
55 case NFT_PARSE_EBADINPUT:
56 return fprintf(stderr,
"%s: Bad input format in line %d column %d\n",
57 msg, err->line, err->column);
58 case NFT_PARSE_EMISSINGNODE:
59 return fprintf(stderr,
"%s: Node \"%s\" not found\n",
61 case NFT_PARSE_EBADTYPE:
62 return fprintf(stderr,
"%s: Invalid type in node \"%s\"\n",
65 return fprintf(stderr,
"%s: Undefined error\n", msg);
68 EXPORT_SYMBOL(nft_parse_perror);
70 int nft_event_header_snprintf(
char *buf,
size_t size, uint32_t type,
75 if (!(flags & NFT_OF_EVENT_ANY))
80 if (flags & NFT_OF_EVENT_NEW) {
81 ret = snprintf(buf, size,
"<event><type>new</type>");
82 }
else if (flags & NFT_OF_EVENT_DEL) {
83 ret = snprintf(buf, size,
84 "<event><type>delete</type>");
86 ret = snprintf(buf, size,
87 "<event><type>unknown</type>");
91 if (flags & NFT_OF_EVENT_NEW) {
92 ret = snprintf(buf, size,
"{event:{type:\"new\",{\"");
93 }
else if (flags & NFT_OF_EVENT_DEL) {
94 ret = snprintf(buf, size,
95 "{event:{type:\"delete\",{\"");
97 ret = snprintf(buf, size,
98 "{event:{type:\"unknown\",{\"");
102 if (flags & NFT_OF_EVENT_NEW) {
103 ret = snprintf(buf, size,
"%9s",
"[NEW] ");
104 }
else if (flags & NFT_OF_EVENT_DEL) {
105 ret = snprintf(buf, size,
"%9s",
"[DELETE] ");
107 ret = snprintf(buf, size,
"%9s",
"[unknown] ");
114 int nft_event_header_fprintf(FILE *fp, uint32_t type, uint32_t flags)
118 nft_event_header_snprintf(buf,
sizeof(buf), type, flags);
119 buf[
sizeof(buf) - 1] =
'\0';
121 return fprintf(fp,
"%s", buf);
124 int nft_event_footer_snprintf(
char *buf,
size_t size, uint32_t type,
127 if (!(flags & NFT_OF_EVENT_ANY))
132 return snprintf(buf, size,
"</event>");
133 case NFT_OUTPUT_JSON:
134 return snprintf(buf, size,
"}}}");
140 int nft_event_footer_fprintf(FILE *fp, uint32_t type, uint32_t flags)
144 nft_event_footer_snprintf(buf,
sizeof(buf), type, flags);
145 buf[
sizeof(buf) - 1] =
'\0';
147 return fprintf(fp,
"%s", buf);