16 #include <libnftnl/common.h>
19 int nftnl_buf_update(
struct nftnl_buf *b,
int ret)
34 int nftnl_buf_done(
struct nftnl_buf *b)
40 if (b->size > 0 && b->buf[b->size - 1] ==
',') {
49 static int nftnl_buf_put(
struct nftnl_buf *b,
const char *fmt, ...)
55 ret = vsnprintf(b->buf + b->off, b->len, fmt, ap);
56 ret = nftnl_buf_update(b, ret);
62 int nftnl_buf_open(
struct nftnl_buf *b,
int type,
const char *tag)
65 case NFTNL_OUTPUT_XML:
66 return nftnl_buf_put(b,
"<%s>", tag);
67 case NFTNL_OUTPUT_JSON:
68 return nftnl_buf_put(b,
"{\"%s\":{", tag);
74 int nftnl_buf_close(
struct nftnl_buf *b,
int type,
const char *tag)
77 case NFTNL_OUTPUT_XML:
78 return nftnl_buf_put(b,
"</%s>", tag);
79 case NFTNL_OUTPUT_JSON:
81 if (b->size > 0 && b->buf[b->size - 1] ==
',') {
87 return nftnl_buf_put(b,
"}}");
93 int nftnl_buf_open_array(
struct nftnl_buf *b,
int type,
const char *tag)
96 case NFTNL_OUTPUT_JSON:
97 return nftnl_buf_put(b,
"{\"%s\":[", tag);
98 case NFTNL_OUTPUT_XML:
99 return nftnl_buf_put(b,
"<%s>", tag);
105 int nftnl_buf_close_array(
struct nftnl_buf *b,
int type,
const char *tag)
108 case NFTNL_OUTPUT_JSON:
109 return nftnl_buf_put(b,
"]}");
110 case NFTNL_OUTPUT_XML:
111 return nftnl_buf_put(b,
"</%s>", tag);
117 int nftnl_buf_u32(
struct nftnl_buf *b,
int type, uint32_t value,
const char *tag)
120 case NFTNL_OUTPUT_XML:
121 return nftnl_buf_put(b,
"<%s>%u</%s>", tag, value, tag);
122 case NFTNL_OUTPUT_JSON:
123 return nftnl_buf_put(b,
"\"%s\":%u,", tag, value);
129 int nftnl_buf_s32(
struct nftnl_buf *b,
int type, uint32_t value,
const char *tag)
132 case NFTNL_OUTPUT_XML:
133 return nftnl_buf_put(b,
"<%s>%d</%s>", tag, value, tag);
134 case NFTNL_OUTPUT_JSON:
135 return nftnl_buf_put(b,
"\"%s\":%d,", tag, value);
141 int nftnl_buf_u64(
struct nftnl_buf *b,
int type, uint64_t value,
const char *tag)
144 case NFTNL_OUTPUT_XML:
145 return nftnl_buf_put(b,
"<%s>%"PRIu64
"</%s>", tag, value, tag);
146 case NFTNL_OUTPUT_JSON:
147 return nftnl_buf_put(b,
"\"%s\":%"PRIu64
",", tag, value);
153 int nftnl_buf_str(
struct nftnl_buf *b,
int type,
const char *str,
const char *tag)
156 case NFTNL_OUTPUT_XML:
157 return nftnl_buf_put(b,
"<%s>%s</%s>", tag, str, tag);
158 case NFTNL_OUTPUT_JSON:
159 return nftnl_buf_put(b,
"\"%s\":\"%s\",", tag, str);
165 int nftnl_buf_reg(
struct nftnl_buf *b,
int type,
union nftnl_data_reg *reg,
166 int reg_type,
const char *tag)
171 case NFTNL_OUTPUT_XML:
172 ret = nftnl_buf_put(b,
"<%s>", tag);
173 ret = nftnl_data_reg_snprintf(b->buf + b->off, b->len, reg,
174 NFTNL_OUTPUT_XML, 0, reg_type);
175 nftnl_buf_update(b, ret);
176 return nftnl_buf_put(b,
"</%s>", tag);
177 case NFTNL_OUTPUT_JSON:
178 nftnl_buf_put(b,
"\"%s\":{", tag);
179 ret = nftnl_data_reg_snprintf(b->buf + b->off, b->len, reg,
180 NFTNL_OUTPUT_JSON, 0, reg_type);
181 nftnl_buf_update(b, ret);
182 return nftnl_buf_put(b,
"},");