]>
git.ipfire.org Git - thirdparty/strongswan.git/blob - scripts/settings-test.c
2 * Copyright (C) 2014-2018 Tobias Brunner
3 * HSR Hochschule fuer Technik Rapperswil
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>.
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
24 #include <settings/settings_types.h>
27 * Defined in libstrongswan but not part of the public API
29 bool settings_parser_parse_file(void *this, char *name
);
32 * Produce indentation for the given level
34 static void get_indent(char indent
[BUF_LEN
], int level
)
38 for (i
= 0; i
< level
* 2 && i
< BUF_LEN
- 2; i
+= 2)
47 * Recursively print the section and all subsections/settings
49 static void print_section(section_t
*section
, int level
)
57 get_indent(indent
, level
);
59 for (i
= 0; i
< array_count(section
->kv_order
); i
++)
61 array_get(section
->kv_order
, i
, &kv
);
62 printf("%s%s = %s\n", indent
, kv
->key
, kv
->value
);
64 for (i
= 0; i
< array_count(section
->sections_order
); i
++)
66 array_get(section
->sections_order
, i
, &sub
);
67 printf("%s%s", indent
, sub
->name
);
68 if (array_count(sub
->references
))
70 for (j
= 0; j
< array_count(sub
->references
); j
++)
72 array_get(sub
->references
, j
, &ref
);
73 printf("%s%s", j
== 0 ? " : " : ", ", ref
->name
);
77 print_section(sub
, level
+ 1);
78 printf("%s}\n", indent
);
83 * Recursively print a given section and all subsections/settings
85 static void print_settings_section(settings_t
*settings
, char *section
,
88 enumerator_t
*enumerator
;
89 char indent
[BUF_LEN
], buf
[BUF_LEN
], *key
, *value
;
91 get_indent(indent
, level
);
93 enumerator
= settings
->create_key_value_enumerator(settings
, section
);
94 while (enumerator
->enumerate(enumerator
, &key
, &value
))
96 printf("%s%s = %s\n", indent
, key
, value
);
99 enumerator
->destroy(enumerator
);
101 enumerator
= settings
->create_section_enumerator(settings
, section
);
102 while (enumerator
->enumerate(enumerator
, &key
))
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
);
110 enumerator
->destroy(enumerator
);
113 static void usage(FILE *out
, char *name
)
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");
125 int main(int argc
, char *argv
[])
128 bool resolve
= FALSE
;
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' },
139 switch (getopt_long(argc
, argv
, "hdf:r", long_opts
, NULL
))
144 usage(stdout
, argv
[0]);
147 setenv("DEBUG_SETTINGS_PARSER", "1", TRUE
);
156 usage(stderr
, argv
[0]);
162 /* don't load strongswan.conf */
163 library_init("", "settings-test");
164 atexit(library_deinit
);
166 dbg_default_set_level(3);
172 settings_t
*settings
= settings_create(file
);
174 print_settings_section(settings
, "", 0);
176 settings
->destroy(settings
);
180 section_t
*root
= settings_section_create(strdup("root"));
182 settings_parser_parse_file(root
, file
);
184 print_section(root
, 0);
186 settings_section_destroy(root
, NULL
);
191 usage(stderr
, argv
[0]);