Annotation of embedaddon/libpdel/structs/test/main.c, revision 1.1.1.1
1.1 misho 1:
2: /*
3: * Copyright (c) 2001-2002 Packet Design, LLC.
4: * All rights reserved.
5: *
6: * Subject to the following obligations and disclaimer of warranty,
7: * use and redistribution of this software, in source or object code
8: * forms, with or without modifications are expressly permitted by
9: * Packet Design; provided, however, that:
10: *
11: * (i) Any and all reproductions of the source or object code
12: * must include the copyright notice above and the following
13: * disclaimer of warranties; and
14: * (ii) No rights are granted, in any manner or form, to use
15: * Packet Design trademarks, including the mark "PACKET DESIGN"
16: * on advertising, endorsements, or otherwise except as such
17: * appears in the above copyright notice or in the software.
18: *
19: * THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND
20: * TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO
21: * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING
22: * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED
23: * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
24: * OR NON-INFRINGEMENT. PACKET DESIGN DOES NOT WARRANT, GUARANTEE,
25: * OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS
26: * OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY,
27: * RELIABILITY OR OTHERWISE. IN NO EVENT SHALL PACKET DESIGN BE
28: * LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE
29: * OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT,
30: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL
31: * DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF
32: * USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF
33: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
35: * THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF
36: * THE POSSIBILITY OF SUCH DAMAGE.
37: *
38: * Author: Archie Cobbs <archie@freebsd.org>
39: */
40:
41: #include <sys/types.h>
42: #include <sys/time.h>
43: #include <netinet/in.h>
44: #include <arpa/inet.h>
45: #ifndef NO_BPF
46: #include <net/bpf.h>
47: #endif
48:
49: #include <stdio.h>
50: #include <stdlib.h>
51: #include <stdarg.h>
52: #include <stddef.h>
53: #include <string.h>
54: #include <unistd.h>
55: #include <errno.h>
56: #ifndef NO_BPF
57: #include <pcap.h>
58: #endif
59: #include <err.h>
60:
61: #include <pdel/structs/structs.h>
62: #include <pdel/structs/xml.h>
63: #include <pdel/structs/types.h>
64: #include <pdel/structs/xmlrpc.h>
65: #include <pdel/structs/type/ip6.h>
66: #include <pdel/sys/alog.h>
67: #include <pdel/util/typed_mem.h>
68:
69: #define ELEM_TAG "structs_test"
70: #define XMLRPC_TAG "value"
71: #define ATTR_MEM_TYPE "attr_mem_type"
72:
73: /* Our structures, etc */
74: struct array_elem {
75: u_int16_t elem_value;
76: char *elem_string;
77: u_char elem_ether[6];
78: u_int32_t elem_color;
79: struct in_addr elem_ip;
80: float elem_float;
81: double elem_double;
82: u_char elem_bytes[13];
83: char elem_bstring[13];
84: struct structs_dnsname elem_dnsname;
85: };
86:
87: union ip_address {
88: struct in_addr ip4;
89: struct in6_addr ip6;
90: };
91:
92: /* fields for union ip_address */
93: static const struct structs_ufield ip_address_fields[] = {
94: STRUCTS_UNION_FIELD(ip4, &structs_type_ip4),
95: STRUCTS_UNION_FIELD(ip6, &structs_type_ip6),
96: STRUCTS_UNION_FIELD_END
97: };
98:
99: /* structs type for union ip_address */
100: static const struct structs_type ip_address_type
101: = STRUCTS_UNION_TYPE(ip_address, &ip_address_fields);
102:
103: /* c type for union ip_address */
104: DEFINE_STRUCTS_UNION(ip_address_struct, ip_address);
105:
106: struct prefix_ip {
107: struct ip_address_struct ip_addr;
108: u_int masklen;
109: };
110:
111: static struct structs_field prefix_ip_fields[] = {
112: STRUCTS_STRUCT_FIELD(prefix_ip, ip_addr, &ip_address_type),
113: STRUCTS_STRUCT_FIELD(prefix_ip, masklen, &structs_type_uint),
114: STRUCTS_STRUCT_FIELD_END
115: };
116:
117: static const struct structs_type prefix_ip_type
118: = STRUCTS_STRUCT_TYPE(prefix_ip, prefix_ip_fields);
119:
120: union my_union {
121: char *u_string;
122: int64_t u_int64;
123: u_char u_bool;
124: };
125:
126: DEFINE_STRUCTS_UNION(ustruct, my_union);
127:
128: #define INNER_STRARY_LEN 4
129:
130: struct inner_struct {
131: char *inner_string;
132: struct structs_data inner_data;
133: struct structs_data inner_data2;
134: struct structs_array inner_array;
135: struct array_elem inner_struct;
136: struct structs_array inner_struct_ptr_array;
137: u_char *inner_ether;
138: struct alog_config inner_alog;
139: #ifndef NO_BPF
140: struct structs_bpf *inner_bpf;
141: #endif
142: time_t inner_time_gmt;
143: time_t inner_time_local;
144: time_t inner_time_iso8601;
145: time_t inner_time_rel;
146: struct ustruct inner_union;
147: struct ustruct inner_union2;
148: struct ip_address_struct ip6_mapped_from_ip4;
149: struct ip_address_struct ip6;
150: struct ip_address_struct ip4;
151: struct prefix_ip pfx_ip6;
152: struct prefix_ip pfx_ip4;
153: struct structs_regex inner_regex;
154: char *inner_strary[INNER_STRARY_LEN];
155: };
156:
157: /* Type for field 'elem_color' */
158: static const struct structs_id color_list[] = {
159: { "Red", 1 }, { "Green", 2 }, { "Blue", 3 }, { NULL, 0 }
160: };
161: static const struct structs_type color_type
162: = STRUCTS_ID_TYPE(color_list, sizeof(u_int32_t));
163:
164: /* Type for field 'elem_bytes' */
165: static const struct structs_type elem_bytes_type
166: = STRUCTS_FIXEDDATA_TYPE(sizeof(((struct array_elem *)0)->elem_bytes));
167:
168: /* Type for field 'elem_bstring' */
169: static const struct structs_type elem_bstring_type
170: = STRUCTS_FIXEDSTRING_TYPE(
171: sizeof(((struct array_elem *)0)->elem_bstring));
172:
173: /* Type for struct array_elem */
174: static const struct structs_field array_elem_fields[] = {
175: STRUCTS_STRUCT_FIELD(array_elem, elem_value, &structs_type_uint16),
176: STRUCTS_STRUCT_FIELD(array_elem, elem_string, &structs_type_string),
177: STRUCTS_STRUCT_FIELD(array_elem, elem_ether, &structs_type_ether),
178: STRUCTS_STRUCT_FIELD(array_elem, elem_bstring, &elem_bstring_type),
179: STRUCTS_STRUCT_FIELD(array_elem, elem_dnsname, &structs_type_dnsname),
180: STRUCTS_STRUCT_FIELD(array_elem, elem_color, &color_type),
181: STRUCTS_STRUCT_FIELD(array_elem, elem_ip, &structs_type_ip4),
182: STRUCTS_STRUCT_FIELD(array_elem, elem_float, &structs_type_float),
183: STRUCTS_STRUCT_FIELD(array_elem, elem_double, &structs_type_double),
184: STRUCTS_STRUCT_FIELD(array_elem, elem_bytes, &elem_bytes_type),
185: STRUCTS_STRUCT_FIELD_END
186: };
187: static const struct structs_type array_elem_type
188: = STRUCTS_STRUCT_TYPE(array_elem, &array_elem_fields);
189: static const struct structs_type array_elem_ptr_type
190: = STRUCTS_POINTER_TYPE(&array_elem_type, "array_elem_ptr");
191: /* Type for array of pointers to array_elems type */
192: static const struct structs_type array_elem_ptr_array_type
193: = STRUCTS_ARRAY_TYPE(&array_elem_ptr_type,
194: "inner_struct_ptr", "inner_struct_ptr");
195:
196: /* Type for array of array_elems type */
197: static const struct structs_type inner_array_type
198: = STRUCTS_ARRAY_TYPE(&array_elem_type, "array_elem", "array_elem");
199:
200: /* Type for pointer to Ethernet address */
201: static const struct structs_type ether_ptr_type
202: = STRUCTS_POINTER_TYPE(&structs_type_ether_nocolon, "ether_ptr");
203:
204: /* Type for union my_union */
205: static const struct structs_ufield my_union_fields[] = {
206: STRUCTS_UNION_FIELD(u_string, &structs_type_string),
207: STRUCTS_UNION_FIELD(u_int64, &structs_type_int64),
208: STRUCTS_UNION_FIELD(u_bool, &structs_type_boolean_char),
209: STRUCTS_UNION_FIELD_END
210: };
211: static const struct structs_type my_union_type
212: = STRUCTS_UNION_TYPE(my_union, &my_union_fields);
213:
214: /* Type for field "inner_strary" in struct inner_struct */
215: static const struct structs_type structs_type_strary
216: = STRUCTS_FIXEDARRAY_TYPE(&structs_type_string,
217: sizeof(char *), INNER_STRARY_LEN, "strary_elem");
218:
219: #ifndef NO_BPF
220: /* Type for field "inner_bpf" in struct inner_struct */
221: static structs_bpf_compile_t bpf_compiler;
222:
223: static const struct structs_type inner_bpf_type
224: = BPF_STRUCTS_TYPE(DLT_EN10MB, bpf_compiler);
225: #endif
226:
227: /* Type for struct inner_struct */
228: static const struct structs_field inner_struct_fields[] = {
229: STRUCTS_STRUCT_FIELD(inner_struct, inner_string, &structs_type_string),
230: STRUCTS_STRUCT_FIELD(inner_struct, inner_data, &structs_type_data),
231: STRUCTS_STRUCT_FIELD(inner_struct, inner_data2, &structs_type_hexdata),
232: STRUCTS_STRUCT_FIELD(inner_struct, inner_array, &inner_array_type),
233: STRUCTS_STRUCT_FIELD(inner_struct, inner_struct, &array_elem_type),
234: STRUCTS_STRUCT_FIELD(inner_struct, inner_struct_ptr_array,
235: &array_elem_ptr_array_type),
236: STRUCTS_STRUCT_FIELD(inner_struct, inner_ether, ðer_ptr_type),
237: STRUCTS_STRUCT_FIELD(inner_struct, inner_alog, &alog_config_type),
238: #ifndef NO_BPF
239: STRUCTS_STRUCT_FIELD(inner_struct, inner_bpf, &inner_bpf_type),
240: #endif
241: STRUCTS_STRUCT_FIELD(inner_struct, inner_time_gmt,
242: &structs_type_time_gmt),
243: STRUCTS_STRUCT_FIELD(inner_struct, inner_time_local,
244: &structs_type_time_local),
245: STRUCTS_STRUCT_FIELD(inner_struct, inner_time_iso8601,
246: &structs_type_time_iso8601),
247: STRUCTS_STRUCT_FIELD(inner_struct, inner_time_rel,
248: &structs_type_time_rel),
249: STRUCTS_STRUCT_FIELD(inner_struct, inner_union, &my_union_type),
250: STRUCTS_STRUCT_FIELD(inner_struct, inner_union2, &my_union_type),
251: STRUCTS_STRUCT_FIELD(inner_struct, ip6_mapped_from_ip4, &ip_address_type),
252: STRUCTS_STRUCT_FIELD(inner_struct, ip6, &ip_address_type),
253: STRUCTS_STRUCT_FIELD(inner_struct, ip4, &ip_address_type),
254: STRUCTS_STRUCT_FIELD(inner_struct, pfx_ip6, &prefix_ip_type),
255: STRUCTS_STRUCT_FIELD(inner_struct, pfx_ip4, &prefix_ip_type),
256: STRUCTS_STRUCT_FIELD(inner_struct, inner_regex, &structs_type_regex),
257: STRUCTS_STRUCT_FIELD(inner_struct, inner_strary, &structs_type_strary),
258: STRUCTS_STRUCT_FIELD_END
259: };
260: static const struct structs_type inner_struct_type
261: = STRUCTS_STRUCT_TYPE(inner_struct, &inner_struct_fields);
262:
263: static int structs_encode(const char *fname);
264: static int structs_decode(const char *fname);
265:
266: static struct in_addr random_ip = { 0x04030201 };
267:
268: static int flags;
269:
270: int
271: main(int argc, char *argv[])
272: {
273: const struct structs_type *type = &inner_struct_type;
274: struct inner_struct s, scopy;
275: const char *name = "inner_array.1.elem_string";
276: const char *value = "new value";
277: const char *fname = NULL;
278: char ebuf[128] = { '\0' };
279: int xml2xmlrpc = 0;
280: int normalize = 0;
281: int nostats = 0;
282: int coding = 0;
283: void *xmlrpc;
284: char *attrs;
285: char *t;
286: int ch;
287:
288: /* Parse command line arguments */
289: while ((ch = getopt(argc, argv, "cdef:nxlTt")) != -1) {
290: switch (ch) {
291: case 'c':
292: flags |= STRUCTS_XML_COMB_TAGS;
293: break;
294: case 'd':
295: coding = -1;
296: break;
297: case 'e':
298: coding = 1;
299: break;
300: case 'f':
301: fname = optarg;
302: break;
303: case 'l':
304: flags |= STRUCTS_XML_LOOSE;
305: break;
306: case 'n':
307: normalize = 1;
308: break;
309: case 'x':
310: nostats = 1;
311: break;
312: case 't':
313: xml2xmlrpc = 1;
314: break;
315: case 'T':
316: xml2xmlrpc = -1;
317: break;
318: default:
319: usage: errx(1, "usage:\n"
320: "\tstructs_test [-xlc] < test.xml\n"
321: "\tstructs_test -n [-xlc] < test.xml > test.xml\n"
322: "\tstructs_test -t [-xlc] < test.xml > test.xmlrpc\n"
323: "\tstructs_test -T [-x] < test.xmlrpc > test.xml\n"
324: "\tstructs_test -e [-f field] [-xlc] < test.xml > test.bin\n"
325: "\tstructs_test -d [-f field] [-xlc] < test.bin > test.xml");
326: }
327: }
328: argc -= optind;
329: argv += optind;
330: switch (argc) {
331: case 0:
332: break;
333: default:
334: goto usage;
335: }
336:
337: if (typed_mem_enable() == -1)
338: err(1, "typed_mem_enable");
339:
340: if (coding && normalize)
341: goto usage;
342:
343: /* Binary encoding/decoding? */
344: if (coding == 1) {
345: structs_encode(fname);
346: goto done;
347: }
348: if (coding == -1) {
349: structs_decode(fname);
350: goto done;
351: }
352:
353: /* Convert between XML and XML-RPC? */
354: if (xml2xmlrpc == 1) {
355: const struct structs_type *const xtype
356: = &structs_type_xmlrpc_value;
357: struct xmlrpc_value_union xvalue;
358:
359: if (structs_xml_input(type, ELEM_TAG, NULL,
360: NULL, stdin, &s, STRUCTS_XML_UNINIT | flags,
361: STRUCTS_LOGGER_STDERR) == -1)
362: err(1, "structs_xml_input");
363: if (structs_init(xtype, NULL, &xvalue) == -1)
364: err(1, "structs_init");
365: if (structs_struct2xmlrpc(type, &s, NULL,
366: xtype, &xvalue, NULL) == -1)
367: err(1, "structs_struct2xmlrpc");
368: structs_free(type, NULL, &s);
369: if (structs_xml_output(xtype, XMLRPC_TAG, NULL,
370: &xvalue, stdout, NULL, 0) == -1)
371: err(1, "structs_xml_output");
372: structs_free(xtype, NULL, &xvalue);
373: goto done;
374: } else if (xml2xmlrpc == -1) {
375: const struct structs_type *const xtype
376: = &structs_type_xmlrpc_value;
377: struct xmlrpc_value_union xvalue;
378:
379: if (structs_xml_input(xtype, XMLRPC_TAG, NULL,
380: NULL, stdin, &xvalue, STRUCTS_XML_UNINIT,
381: STRUCTS_LOGGER_STDERR) == -1)
382: err(1, "structs_xml_input");
383: if (structs_init(type, NULL, &s) == -1)
384: err(1, "structs_init");
385: if (structs_xmlrpc2struct(xtype, &xvalue, NULL,
386: type, &s, NULL, ebuf, sizeof(ebuf)) == -1)
387: errx(1, "structs_struct2xmlrpc: %s", ebuf);
388: structs_free(xtype, NULL, &xvalue);
389: if (structs_xml_output(type, ELEM_TAG, NULL,
390: &s, stdout, NULL, 0) == -1)
391: err(1, "structs_xml_output");
392: structs_free(type, NULL, &s);
393: goto done;
394: }
395:
396: /* Normalize XML? */
397: if (normalize) {
398: if (structs_xml_input(type, ELEM_TAG, NULL,
399: NULL, stdin, &s, STRUCTS_XML_UNINIT | flags,
400: STRUCTS_LOGGER_STDERR) == -1)
401: err(1, "structs_xml_input");
402: if (structs_xml_output(type, ELEM_TAG, NULL,
403: &s, stdout, NULL, 0) == -1)
404: err(1, "structs_xml_output");
405: structs_free(type, NULL, &s);
406: goto done;
407: }
408:
409: printf(">>>>>>>> TEST: Initializing struct...\n");
410: if (structs_init(type, NULL, &s) == -1) {
411: warn("structs_init");
412: goto done;
413: }
414:
415: printf(">>>>>>>> TEST: Dumping initialized struct...\n");
416: if (structs_xml_output(type,
417: ELEM_TAG, NULL, &s, stdout, NULL, 0) == -1) {
418: warn("structs_xml_output");
419: structs_free(type, NULL, &s);
420: goto done;
421: }
422:
423: printf(">>>>>>>> TEST: Free'ing struct...\n");
424: structs_free(type, NULL, &s);
425:
426: printf(">>>>>>>> TEST: Initializing struct...\n");
427: if (structs_init(type, NULL, &s) == -1) {
428: warn("structs_init");
429: goto done;
430: }
431:
432: printf(">>>>>>>> TEST: Setting %s to \"%s\"...\n",
433: "inner_union.u_int64", "0");
434: if (structs_set_string(type, "inner_union.u_int64",
435: "0", &s, ebuf, sizeof(ebuf)) == -1) {
436: warnx("structs_set_string: %s", ebuf);
437: structs_free(type, NULL, &s);
438: goto done;
439: }
440:
441: printf(">>>>>>>> TEST: Dumping struct, should show the union...\n");
442: if (structs_xml_output(type,
443: ELEM_TAG, NULL, &s, stdout, NULL, 0) == -1) {
444: warn("structs_xml_output");
445: structs_free(type, NULL, &s);
446: goto done;
447: }
448:
449: {
450: const char *elems[] = { "inner_union", NULL };
451:
452: printf(">>>>>>>> TEST: Dumping only \"%s\", but full...\n", elems[0]);
453: if (structs_xml_output(type,
454: ELEM_TAG, NULL, &s, stdout, elems, STRUCTS_XML_FULL) == -1) {
455: warn("structs_xml_output");
456: FREE(ATTR_MEM_TYPE, attrs);
457: structs_free(type, NULL, &s);
458: goto done;
459: }
460: }
461:
462: printf(">>>>>>>> TEST: Copying struct...\n");
463: if (structs_get(type, NULL, &s, &scopy) == -1) {
464: warn("structs_get");
465: structs_free(type, NULL, &s);
466: goto done;
467: }
468:
469: printf(">>>>>>>> TEST: Free'ing both structs...\n");
470: structs_free(type, NULL, &s);
471: structs_free(type, NULL, &scopy);
472:
473: printf(">>>>>>>> TEST: Reading input...\n");
474: if (structs_xml_input(type, ELEM_TAG, &attrs,
475: ATTR_MEM_TYPE, stdin, &s, STRUCTS_XML_UNINIT | flags,
476: STRUCTS_LOGGER_STDERR) == -1) {
477: warn("structs_xml_input");
478: goto done;
479: }
480:
481: printf(">>>>>>>> TEST: Displaying attributes...\n");
482: for (t = attrs; *t != '\0'; ) {
483: printf("%30s =", t);
484: t += strlen(t) + 1;
485: printf(" %s\n", t);
486: t += strlen(t) + 1;
487: }
488:
489: printf(">>>>>>>> TEST: Dumping output...\n");
490: if (structs_xml_output(type,
491: ELEM_TAG, attrs, &s, stdout, NULL, 0) == -1) {
492: warn("structs_xml_output");
493: FREE(ATTR_MEM_TYPE, attrs);
494: structs_free(type, NULL, &s);
495: goto done;
496: }
497:
498: {
499: const char *elems[] = { "inner_struct", NULL };
500:
501: printf(">>>>>>>> TEST: Dumping only \"%s\" ...\n", elems[0]);
502: if (structs_xml_output(type,
503: ELEM_TAG, attrs, &s, stdout, elems, 0) == -1) {
504: warn("structs_xml_output");
505: FREE(ATTR_MEM_TYPE, attrs);
506: structs_free(type, NULL, &s);
507: goto done;
508: }
509: }
510:
511: {
512: const char *elems[] = {
513: "inner_struct_ptr_array.2.elem_bytes", NULL };
514:
515: printf(">>>>>>>> TEST: Dumping only \"%s\", but full...\n", elems[0]);
516: if (structs_xml_output(type,
517: ELEM_TAG, NULL, &s, stdout, elems, STRUCTS_XML_FULL) == -1) {
518: warn("structs_xml_output");
519: FREE(ATTR_MEM_TYPE, attrs);
520: structs_free(type, NULL, &s);
521: goto done;
522: }
523: }
524:
525: printf(">>>>>>>> TEST: Copying struct...\n");
526: if (structs_get(type, NULL, &s, &scopy) == -1) {
527: warn("structs_get");
528: FREE(ATTR_MEM_TYPE, attrs);
529: structs_free(type, NULL, &s);
530: goto done;
531: }
532:
533: printf(">>>>>>>> TEST: Dumping copy...\n");
534: if (structs_xml_output(type,
535: ELEM_TAG, attrs, &scopy, stdout, NULL, 0) == -1) {
536: warn("structs_xml_output");
537: FREE(ATTR_MEM_TYPE, attrs);
538: structs_free(type, NULL, &scopy);
539: structs_free(type, NULL, &s);
540: goto done;
541: }
542: FREE(ATTR_MEM_TYPE, attrs);
543:
544: printf(">>>>>>>> TEST: Comparing original and copy...\n");
545: printf("equal = %s\n",
546: structs_equal(type, NULL, &s, &scopy) ? "TRUE" : "FALSE");
547:
548: printf(">>>>>>>> TEST: Setting copy's %s to \"%s\"...\n", name, value);
549: if (structs_set_string(type, name, value,
550: &scopy, ebuf, sizeof(ebuf)) == -1) {
551: warnx("structs_set_string: %s", ebuf);
552: structs_free(type, NULL, &scopy);
553: structs_free(type, NULL, &s);
554: goto done;
555: }
556:
557: printf(">>>>>>>> TEST: Setting copy's %s to \"%s\"...\n",
558: "inner_union.u_int64", "1234567890");
559: if (structs_set_string(type, "inner_union.u_int64",
560: "1234567890", &scopy, ebuf, sizeof(ebuf)) == -1) {
561: warnx("structs_set_string: %s", ebuf);
562: structs_free(type, NULL, &scopy);
563: structs_free(type, NULL, &s);
564: goto done;
565: }
566:
567: printf(">>>>>>>> TEST: Setting copy's %s to \"%s\"...\n",
568: "inner_struct.elem_ip", inet_ntoa(random_ip));
569: if (structs_set(type, &random_ip,
570: "inner_struct.elem_ip", &scopy) == -1) {
571: warn("structs_set");
572: structs_free(type, NULL, &scopy);
573: structs_free(type, NULL, &s);
574: goto done;
575: }
576:
577: printf(">>>>>>>> TEST: Comparing original and copy...\n");
578: printf("equal = %s\n",
579: structs_equal(type, NULL, &s, &scopy) ? "TRUE" : "FALSE");
580:
581: printf(">>>>>>>> TEST: Dumping copy...\n");
582: if (structs_xml_output(type,
583: ELEM_TAG, NULL, &scopy, stdout, NULL, 0) == -1) {
584: warn("structs_xml_output");
585: structs_free(type, NULL, &scopy);
586: structs_free(type, NULL, &s);
587: goto done;
588: }
589:
590: printf(">>>>>>>> TEST: Dumping copy in an XML-RPC request...\n");
591: {
592: const struct structs_type *types[1] = { type };
593: const void *datas[1] = { &scopy };
594:
595: if ((xmlrpc = structs_xmlrpc_build_request(TYPED_MEM_TEMP,
596: "someMethodName", 1, types, datas)) == NULL) {
597: warn("structs_xmlrpc_build_request");
598: structs_free(type, NULL, &scopy);
599: structs_free(type, NULL, &s);
600: goto done;
601: }
602: if (structs_xml_output(&structs_type_xmlrpc_request,
603: "methodCall", NULL, xmlrpc, stdout, NULL, 0) == -1) {
604: warn("structs_xml_output");
605: structs_free(&structs_type_xmlrpc_request, NULL, xmlrpc);
606: FREE(TYPED_MEM_TEMP, xmlrpc);
607: structs_free(type, NULL, &scopy);
608: structs_free(type, NULL, &s);
609: goto done;
610: }
611: structs_free(&structs_type_xmlrpc_request, NULL, xmlrpc);
612: FREE(TYPED_MEM_TEMP, xmlrpc);
613: }
614:
615: printf(">>>>>>>> TEST: dumping copy's element list...\n");
616: {
617: char **list;
618: int len;
619: int i;
620:
621: if ((len = structs_traverse(type, &scopy, &list, TYPED_MEM_TEMP)) == -1)
622: err(1, "structs_traverse");
623: for (i = 0; i < len; i++) {
624: char *val;
625:
626: if ((val = structs_get_string(type,
627: list[i], &scopy, TYPED_MEM_TEMP)) == NULL)
628: err(1, "structs_get_string");
629: printf("\t%s=%s\n", list[i], val);
630: FREE(TYPED_MEM_TEMP, val);
631: }
632: while (len > 0)
633: FREE(TYPED_MEM_TEMP, list[--len]);
634: FREE(TYPED_MEM_TEMP, list);
635: }
636:
637: printf(">>>>>>>> TEST: Free'ing original and copy...\n");
638: structs_free(type, NULL, &s);
639: structs_free(type, NULL, &scopy);
640:
641: done:
642: if (!nostats) {
643: FILE *const fp = coding ? stderr : stdout;
644:
645: fprintf(fp, ">>>>>>>> TEST: Displaying unfree'd memory...\n");
646: typed_mem_dump(fp);
647: }
648:
649: /* Done */
650: return (0);
651: }
652:
653: static int
654: structs_encode(const char *fname)
655: {
656: const struct structs_type *type = &inner_struct_type;
657: struct structs_data code;
658: struct inner_struct s;
659:
660: if (structs_xml_input(type, ELEM_TAG, NULL, NULL, stdin,
661: &s, STRUCTS_XML_UNINIT | flags, STRUCTS_LOGGER_STDERR) == -1) {
662: warn("structs_xml_input");
663: return (-1);
664: }
665: if (structs_get_binary(type, fname, &s, TYPED_MEM_TEMP, &code) == -1) {
666: warn("structs_get_binary");
667: structs_free(type, NULL, &s);
668: return (-1);
669: }
670: if (fwrite(code.data, 1, code.length, stdout) != code.length) {
671: warn("fwrite");
672: FREE(TYPED_MEM_TEMP, code.data);
673: structs_free(type, NULL, &s);
674: return (-1);
675: }
676: FREE(TYPED_MEM_TEMP, code.data);
677: structs_free(type, NULL, &s);
678: return (0);
679: }
680:
681: static int
682: structs_decode(const char *fname)
683: {
684: const struct structs_type *type = &inner_struct_type;
685: struct structs_data code;
686: struct inner_struct s;
687: u_char buf[0x10000];
688: char ebuf[128];
689: int blen;
690: int clen;
691:
692: if (structs_init(type, NULL, &s) == -1) {
693: warn("initializing inner_struct");
694: return (-1);
695: }
696: if ((blen = fread(buf, 1, sizeof(buf), stdin)) == 0) {
697: warn("reading input");
698: structs_free(type, NULL, &s);
699: return (-1);
700: }
701: code.data = buf;
702: code.length = blen;
703: if ((clen = structs_set_binary(type,
704: fname, &code, &s, ebuf, sizeof(ebuf))) == -1) {
705: warnx("structs_set_binary: %s", ebuf);
706: structs_free(type, NULL, &s);
707: return (-1);
708: }
709: if (clen < blen) {
710: fprintf(stderr, "WARNING: ignoring %d extra bytes\n",
711: blen - clen);
712: }
713: if (structs_xml_output(type,
714: ELEM_TAG, NULL, &s, stdout, NULL, 0) == -1) {
715: warn("structs_xml_output");
716: structs_free(type, NULL, &s);
717: return (-1);
718: }
719: structs_free(type, NULL, &s);
720: return (0);
721: }
722:
723: #ifndef NO_BPF
724: static int
725: bpf_compiler(const char *string, struct bpf_program *bpf,
726: int linktype, char *ebuf, size_t emax)
727: {
728: pcap_t *pcap;
729:
730: memset(bpf, 0, sizeof(*bpf));
731: if ((pcap = pcap_open_dead(linktype, 2048)) == NULL)
732: return (-1);
733: if (pcap_compile(pcap, bpf, (char *)string, 1, ~0) != 0) {
734: strlcpy(ebuf, pcap_geterr(pcap), emax);
735: pcap_close(pcap);
736: errno = EINVAL;
737: return (-1);
738: }
739: pcap_close(pcap);
740: return (0);
741: }
742: #endif
743:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>