mirror of
				https://github.com/strongswan/strongswan.git
				synced 2025-11-04 00:00:51 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			196 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (C) 2014-2018 Tobias Brunner
 | 
						|
 *
 | 
						|
 * Copyright (C) secunet Security Networks AG
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or modify it
 | 
						|
 * under the terms of the GNU General Public License as published by the
 | 
						|
 * Free Software Foundation; either version 2 of the License, or (at your
 | 
						|
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful, but
 | 
						|
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 | 
						|
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 | 
						|
 * for more details.
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <getopt.h>
 | 
						|
#include <errno.h>
 | 
						|
 | 
						|
#include <library.h>
 | 
						|
#include <settings/settings_types.h>
 | 
						|
 | 
						|
/**
 | 
						|
 * Defined in libstrongswan but not part of the public API
 | 
						|
 */
 | 
						|
bool settings_parser_parse_file(void *this, char *name);
 | 
						|
 | 
						|
/**
 | 
						|
 * Produce indentation for the given level
 | 
						|
 */
 | 
						|
static void get_indent(char indent[BUF_LEN], int level)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
 | 
						|
	for (i = 0; i < level * 2 && i < BUF_LEN - 2; i += 2)
 | 
						|
	{
 | 
						|
		indent[i  ] = ' ';
 | 
						|
		indent[i+1] = ' ';
 | 
						|
	}
 | 
						|
	indent[i] = '\0';
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Recursively print the section and all subsections/settings
 | 
						|
 */
 | 
						|
static void print_section(section_t *section, int level)
 | 
						|
{
 | 
						|
	section_t *sub;
 | 
						|
	section_ref_t *ref;
 | 
						|
	kv_t *kv;
 | 
						|
	char indent[BUF_LEN];
 | 
						|
	int i, j;
 | 
						|
 | 
						|
	get_indent(indent, level);
 | 
						|
 | 
						|
	for (i = 0; i < array_count(section->kv_order); i++)
 | 
						|
	{
 | 
						|
		array_get(section->kv_order, i, &kv);
 | 
						|
		printf("%s%s = %s\n", indent, kv->key, kv->value);
 | 
						|
	}
 | 
						|
	for (i = 0; i < array_count(section->sections_order); i++)
 | 
						|
	{
 | 
						|
		array_get(section->sections_order, i, &sub);
 | 
						|
		printf("%s%s", indent, sub->name);
 | 
						|
		if (array_count(sub->references))
 | 
						|
		{
 | 
						|
			for (j = 0; j < array_count(sub->references); j++)
 | 
						|
			{
 | 
						|
				array_get(sub->references, j, &ref);
 | 
						|
				printf("%s%s", j == 0 ? " : " : ", ", ref->name);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		printf(" {\n");
 | 
						|
		print_section(sub, level + 1);
 | 
						|
		printf("%s}\n", indent);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Recursively print a given section and all subsections/settings
 | 
						|
 */
 | 
						|
static void print_settings_section(settings_t *settings, char *section,
 | 
						|
								   int level)
 | 
						|
{
 | 
						|
	enumerator_t *enumerator;
 | 
						|
	char indent[BUF_LEN], buf[BUF_LEN], *key, *value;
 | 
						|
 | 
						|
	get_indent(indent, level);
 | 
						|
 | 
						|
	enumerator = settings->create_key_value_enumerator(settings, section);
 | 
						|
	while (enumerator->enumerate(enumerator, &key, &value))
 | 
						|
	{
 | 
						|
		printf("%s%s = %s\n", indent, key, value);
 | 
						|
 | 
						|
	}
 | 
						|
	enumerator->destroy(enumerator);
 | 
						|
 | 
						|
	enumerator = settings->create_section_enumerator(settings, section);
 | 
						|
	while (enumerator->enumerate(enumerator, &key))
 | 
						|
	{
 | 
						|
		printf("%s%s {\n", indent, key);
 | 
						|
		snprintf(buf, sizeof(buf), "%s%s%s", section,
 | 
						|
				 strlen(section) ? "." : "", key);
 | 
						|
		print_settings_section(settings, buf, level + 1);
 | 
						|
		printf("%s}\n", indent);
 | 
						|
	}
 | 
						|
	enumerator->destroy(enumerator);
 | 
						|
}
 | 
						|
 | 
						|
static void usage(FILE *out, char *name)
 | 
						|
{
 | 
						|
	fprintf(out, "Test strongswan.conf parser\n\n");
 | 
						|
	fprintf(out, "%s [OPTIONS]\n\n", name);
 | 
						|
	fprintf(out, "Options:\n");
 | 
						|
	fprintf(out, "  -h, --help          print this help.\n");
 | 
						|
	fprintf(out, "  -d, --debug         enables debugging of the parser.\n");
 | 
						|
	fprintf(out, "  -r, --resolve       displays the settings with references/redefines resolved.\n");
 | 
						|
	fprintf(out, "  -f, --file=FILE     config file to load (default STDIN).\n");
 | 
						|
	fprintf(out, "\n");
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char *argv[])
 | 
						|
{
 | 
						|
	char *file = NULL;
 | 
						|
	bool resolve = FALSE;
 | 
						|
 | 
						|
	while (true)
 | 
						|
	{
 | 
						|
		struct option long_opts[] = {
 | 
						|
			{"help",		no_argument,		NULL,	'h' },
 | 
						|
			{"debug",		no_argument,		NULL,	'd' },
 | 
						|
			{"file",		required_argument,	NULL,	'f' },
 | 
						|
			{"resolve",		no_argument,		NULL,	'r' },
 | 
						|
			{0,0,0,0 },
 | 
						|
		};
 | 
						|
		switch (getopt_long(argc, argv, "hdf:r", long_opts, NULL))
 | 
						|
		{
 | 
						|
			case EOF:
 | 
						|
				break;
 | 
						|
			case 'h':
 | 
						|
				usage(stdout, argv[0]);
 | 
						|
				return 0;
 | 
						|
			case 'd':
 | 
						|
				setenv("DEBUG_SETTINGS_PARSER", "1", TRUE);
 | 
						|
				continue;
 | 
						|
			case 'f':
 | 
						|
				file = optarg;
 | 
						|
				continue;
 | 
						|
			case 'r':
 | 
						|
				resolve = TRUE;
 | 
						|
				continue;
 | 
						|
			default:
 | 
						|
				usage(stderr, argv[0]);
 | 
						|
				return 1;
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	}
 | 
						|
 | 
						|
	/* don't load strongswan.conf */
 | 
						|
	library_init("", "settings-test");
 | 
						|
	atexit(library_deinit);
 | 
						|
 | 
						|
	dbg_default_set_level(3);
 | 
						|
 | 
						|
	if (file)
 | 
						|
	{
 | 
						|
		if (resolve)
 | 
						|
		{
 | 
						|
			settings_t *settings = settings_create(file);
 | 
						|
 | 
						|
			print_settings_section(settings, "", 0);
 | 
						|
 | 
						|
			settings->destroy(settings);
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			section_t *root = settings_section_create(strdup("root"));
 | 
						|
 | 
						|
			settings_parser_parse_file(root, file);
 | 
						|
 | 
						|
			print_section(root, 0);
 | 
						|
 | 
						|
			settings_section_destroy(root, NULL);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		usage(stderr, argv[0]);
 | 
						|
	}
 | 
						|
	return 0;
 | 
						|
}
 |