Annotation of embedaddon/strongswan/scripts/settings-test.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2014-2018 Tobias Brunner
        !             3:  * HSR Hochschule fuer Technik Rapperswil
        !             4:  *
        !             5:  * This program is free software; you can redistribute it and/or modify it
        !             6:  * under the terms of the GNU General Public License as published by the
        !             7:  * Free Software Foundation; either version 2 of the License, or (at your
        !             8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !             9:  *
        !            10:  * This program is distributed in the hope that it will be useful, but
        !            11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            13:  * for more details.
        !            14:  */
        !            15: 
        !            16: #include <stdio.h>
        !            17: #include <stdlib.h>
        !            18: #include <string.h>
        !            19: #include <unistd.h>
        !            20: #include <getopt.h>
        !            21: #include <errno.h>
        !            22: 
        !            23: #include <library.h>
        !            24: #include <settings/settings_types.h>
        !            25: 
        !            26: /**
        !            27:  * Defined in libstrongswan but not part of the public API
        !            28:  */
        !            29: bool settings_parser_parse_file(void *this, char *name);
        !            30: 
        !            31: /**
        !            32:  * Produce indentation for the given level
        !            33:  */
        !            34: static void get_indent(char indent[BUF_LEN], int level)
        !            35: {
        !            36:        int i;
        !            37: 
        !            38:        for (i = 0; i < level * 2 && i < BUF_LEN - 2; i += 2)
        !            39:        {
        !            40:                indent[i  ] = ' ';
        !            41:                indent[i+1] = ' ';
        !            42:        }
        !            43:        indent[i] = '\0';
        !            44: }
        !            45: 
        !            46: /**
        !            47:  * Recursively print the section and all subsections/settings
        !            48:  */
        !            49: static void print_section(section_t *section, int level)
        !            50: {
        !            51:        section_t *sub;
        !            52:        section_ref_t *ref;
        !            53:        kv_t *kv;
        !            54:        char indent[BUF_LEN];
        !            55:        int i, j;
        !            56: 
        !            57:        get_indent(indent, level);
        !            58: 
        !            59:        for (i = 0; i < array_count(section->kv_order); i++)
        !            60:        {
        !            61:                array_get(section->kv_order, i, &kv);
        !            62:                printf("%s%s = %s\n", indent, kv->key, kv->value);
        !            63:        }
        !            64:        for (i = 0; i < array_count(section->sections_order); i++)
        !            65:        {
        !            66:                array_get(section->sections_order, i, &sub);
        !            67:                printf("%s%s", indent, sub->name);
        !            68:                if (array_count(sub->references))
        !            69:                {
        !            70:                        for (j = 0; j < array_count(sub->references); j++)
        !            71:                        {
        !            72:                                array_get(sub->references, j, &ref);
        !            73:                                printf("%s%s", j == 0 ? " : " : ", ", ref->name);
        !            74:                        }
        !            75:                }
        !            76:                printf(" {\n");
        !            77:                print_section(sub, level + 1);
        !            78:                printf("%s}\n", indent);
        !            79:        }
        !            80: }
        !            81: 
        !            82: /**
        !            83:  * Recursively print a given section and all subsections/settings
        !            84:  */
        !            85: static void print_settings_section(settings_t *settings, char *section,
        !            86:                                                                   int level)
        !            87: {
        !            88:        enumerator_t *enumerator;
        !            89:        char indent[BUF_LEN], buf[BUF_LEN], *key, *value;
        !            90: 
        !            91:        get_indent(indent, level);
        !            92: 
        !            93:        enumerator = settings->create_key_value_enumerator(settings, section);
        !            94:        while (enumerator->enumerate(enumerator, &key, &value))
        !            95:        {
        !            96:                printf("%s%s = %s\n", indent, key, value);
        !            97: 
        !            98:        }
        !            99:        enumerator->destroy(enumerator);
        !           100: 
        !           101:        enumerator = settings->create_section_enumerator(settings, section);
        !           102:        while (enumerator->enumerate(enumerator, &key))
        !           103:        {
        !           104:                printf("%s%s {\n", indent, key);
        !           105:                snprintf(buf, sizeof(buf), "%s%s%s", section,
        !           106:                                 strlen(section) ? "." : "", key);
        !           107:                print_settings_section(settings, buf, level + 1);
        !           108:                printf("%s}\n", indent);
        !           109:        }
        !           110:        enumerator->destroy(enumerator);
        !           111: }
        !           112: 
        !           113: static void usage(FILE *out, char *name)
        !           114: {
        !           115:        fprintf(out, "Test strongswan.conf parser\n\n");
        !           116:        fprintf(out, "%s [OPTIONS]\n\n", name);
        !           117:        fprintf(out, "Options:\n");
        !           118:        fprintf(out, "  -h, --help          print this help.\n");
        !           119:        fprintf(out, "  -d, --debug         enables debugging of the parser.\n");
        !           120:        fprintf(out, "  -r, --resolve       displays the settings with references/redefines resolved.\n");
        !           121:        fprintf(out, "  -f, --file=FILE     config file to load (default STDIN).\n");
        !           122:        fprintf(out, "\n");
        !           123: }
        !           124: 
        !           125: int main(int argc, char *argv[])
        !           126: {
        !           127:        char *file = NULL;
        !           128:        bool resolve = FALSE;
        !           129: 
        !           130:        while (true)
        !           131:        {
        !           132:                struct option long_opts[] = {
        !           133:                        {"help",                no_argument,            NULL,   'h' },
        !           134:                        {"debug",               no_argument,            NULL,   'd' },
        !           135:                        {"file",                required_argument,      NULL,   'f' },
        !           136:                        {"resolve",             no_argument,            NULL,   'r' },
        !           137:                        {0,0,0,0 },
        !           138:                };
        !           139:                switch (getopt_long(argc, argv, "hdf:r", long_opts, NULL))
        !           140:                {
        !           141:                        case EOF:
        !           142:                                break;
        !           143:                        case 'h':
        !           144:                                usage(stdout, argv[0]);
        !           145:                                return 0;
        !           146:                        case 'd':
        !           147:                                setenv("DEBUG_SETTINGS_PARSER", "1", TRUE);
        !           148:                                continue;
        !           149:                        case 'f':
        !           150:                                file = optarg;
        !           151:                                continue;
        !           152:                        case 'r':
        !           153:                                resolve = TRUE;
        !           154:                                continue;
        !           155:                        default:
        !           156:                                usage(stderr, argv[0]);
        !           157:                                return 1;
        !           158:                }
        !           159:                break;
        !           160:        }
        !           161: 
        !           162:        /* don't load strongswan.conf */
        !           163:        library_init("", "settings-test");
        !           164:        atexit(library_deinit);
        !           165: 
        !           166:        dbg_default_set_level(3);
        !           167: 
        !           168:        if (file)
        !           169:        {
        !           170:                if (resolve)
        !           171:                {
        !           172:                        settings_t *settings = settings_create(file);
        !           173: 
        !           174:                        print_settings_section(settings, "", 0);
        !           175: 
        !           176:                        settings->destroy(settings);
        !           177:                }
        !           178:                else
        !           179:                {
        !           180:                        section_t *root = settings_section_create(strdup("root"));
        !           181: 
        !           182:                        settings_parser_parse_file(root, file);
        !           183: 
        !           184:                        print_section(root, 0);
        !           185: 
        !           186:                        settings_section_destroy(root, NULL);
        !           187:                }
        !           188:        }
        !           189:        else
        !           190:        {
        !           191:                usage(stderr, argv[0]);
        !           192:        }
        !           193:        return 0;
        !           194: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>