10 #include "internal/internal.h"
53 snprintf_expect_meta_xml(
char *buf,
size_t len,
54 const struct nf_expect *exp,
unsigned int flags)
57 unsigned int size = 0, offset = 0;
59 ret = snprintf(buf, len,
"<meta>");
60 BUFFER_SIZE(ret, size, len, offset);
62 if (test_bit(ATTR_EXP_HELPER_NAME, exp->set)) {
63 ret = snprintf(buf+offset, len,
64 "<helper-name>%s</helper-name>",
66 BUFFER_SIZE(ret, size, len, offset);
68 if (test_bit(ATTR_EXP_TIMEOUT, exp->set)) {
69 ret = snprintf(buf+offset, len,
"<timeout>%u</timeout>",
71 BUFFER_SIZE(ret, size, len, offset);
73 if (test_bit(ATTR_EXP_CLASS, exp->set)) {
74 ret = snprintf(buf+offset, len,
"<class>%u</class>",
76 BUFFER_SIZE(ret, size, len, offset);
78 if (test_bit(ATTR_EXP_ZONE, exp->set)) {
79 ret = snprintf(buf+offset, len,
"<zone>%u</zone>", exp->zone);
80 BUFFER_SIZE(ret, size, len, offset);
82 if (flags & NFCT_OF_TIME) {
87 if (localtime_r(&t, &tm) == NULL)
90 ret = snprintf(buf+offset, len,
"<when>");
91 BUFFER_SIZE(ret, size, len, offset);
93 ret = __snprintf_localtime_xml(buf+offset, len, &tm);
94 BUFFER_SIZE(ret, size, len, offset);
96 ret = snprintf(buf+offset, len,
"</when>");
97 BUFFER_SIZE(ret, size, len, offset);
100 if (exp->flags & NF_CT_EXPECT_PERMANENT) {
101 ret = snprintf(buf+offset, len,
"<permanent/>");
102 BUFFER_SIZE(ret, size, len, offset);
104 if (exp->flags & NF_CT_EXPECT_INACTIVE) {
105 ret = snprintf(buf+offset, len,
"<inactive/>");
106 BUFFER_SIZE(ret, size, len, offset);
108 if (exp->flags & NF_CT_EXPECT_USERSPACE) {
109 ret = snprintf(buf+offset, len,
"<userspace/>");
110 BUFFER_SIZE(ret, size, len, offset);
113 ret = snprintf(buf+offset, len,
"</meta>");
114 BUFFER_SIZE(ret, size, len, offset);
120 snprintf_expect_layer3_xml(
char *buf,
size_t len,
const struct nf_expect *exp)
123 unsigned int size = 0, offset = 0;
125 ret = snprintf(buf+offset, len,
126 "<layer3 protonum=\"%d\" protoname=\"%s\">",
127 exp->expected.orig.l3protonum,
128 __l3proto2str(exp->expected.orig.l3protonum));
129 BUFFER_SIZE(ret, size, len, offset);
131 ret = snprintf(buf+offset, len,
"<expected>");
132 BUFFER_SIZE(ret, size, len, offset);
134 ret = __snprintf_addr_xml(buf+offset, len, &exp->expected.orig,
136 BUFFER_SIZE(ret, size, len, offset);
138 ret = __snprintf_addr_xml(buf+offset, len, &exp->expected.orig,
140 BUFFER_SIZE(ret, size, len, offset);
142 ret = snprintf(buf+offset, len,
"</expected>");
143 BUFFER_SIZE(ret, size, len, offset);
145 ret = snprintf(buf+offset, len,
"<mask>");
146 BUFFER_SIZE(ret, size, len, offset);
148 ret = __snprintf_addr_xml(buf+offset, len, &exp->mask.orig,
150 BUFFER_SIZE(ret, size, len, offset);
152 ret = __snprintf_addr_xml(buf+offset, len, &exp->mask.orig,
154 BUFFER_SIZE(ret, size, len, offset);
156 ret = snprintf(buf+offset, len,
"</mask>");
157 BUFFER_SIZE(ret, size, len, offset);
159 ret = snprintf(buf+offset, len,
"<master>");
160 BUFFER_SIZE(ret, size, len, offset);
162 ret = __snprintf_addr_xml(buf+offset, len, &exp->master.orig,
164 BUFFER_SIZE(ret, size, len, offset);
166 ret = __snprintf_addr_xml(buf+offset, len, &exp->master.orig,
168 BUFFER_SIZE(ret, size, len, offset);
170 ret = snprintf(buf+offset, len,
"</master>");
171 BUFFER_SIZE(ret, size, len, offset);
173 ret = snprintf(buf+offset, len,
"</layer3>");
174 BUFFER_SIZE(ret, size, len, offset);
180 snprintf_expect_layer4_xml(
char *buf,
size_t len,
const struct nf_expect *exp)
183 unsigned int size = 0, offset = 0;
185 ret = snprintf(buf+offset, len,
186 "<layer4 protonum=\"%d\" protoname=\"%s\">",
187 exp->expected.orig.protonum,
188 __proto2str(exp->expected.orig.protonum));
189 BUFFER_SIZE(ret, size, len, offset);
191 ret = snprintf(buf+offset, len,
"<expected>");
192 BUFFER_SIZE(ret, size, len, offset);
194 ret = __snprintf_proto_xml(buf+offset, len, &exp->expected.orig,
196 BUFFER_SIZE(ret, size, len, offset);
198 ret = __snprintf_proto_xml(buf+offset, len, &exp->expected.orig,
200 BUFFER_SIZE(ret, size, len, offset);
202 ret = snprintf(buf+offset, len,
"</expected>");
203 BUFFER_SIZE(ret, size, len, offset);
205 ret = snprintf(buf+offset, len,
"<mask>");
206 BUFFER_SIZE(ret, size, len, offset);
208 ret = __snprintf_proto_xml(buf+offset, len, &exp->mask.orig,
210 BUFFER_SIZE(ret, size, len, offset);
212 ret = __snprintf_proto_xml(buf+offset, len, &exp->mask.orig,
214 BUFFER_SIZE(ret, size, len, offset);
216 ret = snprintf(buf+offset, len,
"</mask>");
217 BUFFER_SIZE(ret, size, len, offset);
219 ret = snprintf(buf+offset, len,
"<master>");
220 BUFFER_SIZE(ret, size, len, offset);
222 ret = __snprintf_proto_xml(buf+offset, len, &exp->master.orig,
224 BUFFER_SIZE(ret, size, len, offset);
226 ret = __snprintf_proto_xml(buf+offset, len, &exp->master.orig,
228 BUFFER_SIZE(ret, size, len, offset);
230 ret = snprintf(buf+offset, len,
"</master>");
231 BUFFER_SIZE(ret, size, len, offset);
233 ret = snprintf(buf+offset, len,
"</layer4>");
234 BUFFER_SIZE(ret, size, len, offset)
239 int __snprintf_expect_xml(
char *buf,
unsigned int len,
240 const struct nf_expect *exp,
241 unsigned int msg_type,
unsigned int flags)
243 int ret = 0, size = 0, offset = 0;
247 ret = snprintf(buf, len,
"<flow type=\"new\">");
250 ret = snprintf(buf, len,
"<flow type=\"update\">");
253 ret = snprintf(buf, len,
"<flow type=\"destroy\">");
256 ret = snprintf(buf, len,
"<flow>");
259 BUFFER_SIZE(ret, size, len, offset);
261 ret = snprintf_expect_layer3_xml(buf+offset, len, exp);
262 BUFFER_SIZE(ret, size, len, offset);
264 ret = snprintf_expect_layer4_xml(buf+offset, len, exp);
265 BUFFER_SIZE(ret, size, len, offset);
267 ret = snprintf_expect_meta_xml(buf+offset, len, exp, flags);
268 BUFFER_SIZE(ret, size, len, offset);
270 ret = snprintf(buf+offset, len,
"</flow>");
271 BUFFER_SIZE(ret, size, len, offset);