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, &ether_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>