Annotation of embedaddon/strongswan/scripts/settings-test.c, revision 1.1.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>