Annotation of embedaddon/libpdel/structs/test/main.c, revision 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>