Annotation of embedaddon/strongswan/src/libcharon/plugins/uci/uci_parser.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2008 Martin Willi
! 3: * Copyright (C) 2008 Thomas Kallenberg
! 4: * HSR Hochschule fuer Technik Rapperswil
! 5: *
! 6: * This program is free software; you can redistribute it and/or modify it
! 7: * under the terms of the GNU General Public License as published by the
! 8: * Free Software Foundation; either version 2 of the License, or (at your
! 9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 10: *
! 11: * This program is distributed in the hope that it will be useful, but
! 12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 14: * for more details.
! 15: */
! 16:
! 17: #include "uci_parser.h"
! 18:
! 19: #include <stdarg.h>
! 20:
! 21: #include <library.h>
! 22: #include <uci.h>
! 23:
! 24: typedef struct private_uci_parser_t private_uci_parser_t;
! 25:
! 26: /**
! 27: * Private data of an uci_parser_t object
! 28: */
! 29: struct private_uci_parser_t {
! 30:
! 31: /**
! 32: * Public part
! 33: */
! 34: uci_parser_t public;
! 35:
! 36: /**
! 37: * UCI package name this parser reads
! 38: */
! 39: char *package;
! 40: };
! 41:
! 42: /**
! 43: * enumerator implementation create_section_enumerator
! 44: */
! 45: typedef struct {
! 46: /** implements enumerator */
! 47: enumerator_t public;
! 48: /** currently enumerated uci section */
! 49: struct uci_element *current;
! 50: /** all uci ipsec config sections */
! 51: struct uci_list *list;
! 52: /** uci conntext */
! 53: struct uci_context *ctx;
! 54: /** ipsec uci package */
! 55: struct uci_package *package;
! 56: /** NULL terminated list of keywords */
! 57: char *keywords[];
! 58: } section_enumerator_t;
! 59:
! 60: METHOD(enumerator_t, section_enumerator_enumerate, bool,
! 61: section_enumerator_t *this, va_list args)
! 62: {
! 63: struct uci_element *element;
! 64: char **value;
! 65: int i;
! 66:
! 67: if (&this->current->list == this->list)
! 68: {
! 69: return FALSE;
! 70: }
! 71:
! 72: value = va_arg(args, char**);
! 73: if (value)
! 74: {
! 75: if (uci_lookup(this->ctx, &element, this->package,
! 76: this->current->name, "name") == UCI_OK)
! 77: { /* use "name" attribute as config name if available ... */
! 78: *value = uci_to_option(element)->value;
! 79: }
! 80: else
! 81: { /* ... or the section name becomes config name */
! 82: *value = uci_to_section(this->current)->type;
! 83: }
! 84: }
! 85:
! 86: /* followed by keyword parameters */
! 87: for (i = 0; this->keywords[i]; i++)
! 88: {
! 89: value = va_arg(args, char**);
! 90: if (value && uci_lookup(this->ctx, &element, this->package,
! 91: this->current->name, this->keywords[i]) == UCI_OK)
! 92: {
! 93: *value = uci_to_option(element)->value;
! 94: }
! 95: }
! 96:
! 97: this->current = list_to_element(this->current->list.next);
! 98: return TRUE;
! 99: }
! 100:
! 101: METHOD(enumerator_t, section_enumerator_destroy, void,
! 102: section_enumerator_t *this)
! 103: {
! 104: uci_free_context(this->ctx);
! 105: free(this);
! 106: }
! 107:
! 108: METHOD(uci_parser_t, create_section_enumerator, enumerator_t*,
! 109: private_uci_parser_t *this, ...)
! 110: {
! 111: section_enumerator_t *e;
! 112: va_list args;
! 113: int i;
! 114:
! 115: /* allocate enumerator large enough to hold keyword pointers */
! 116: i = 1;
! 117: va_start(args, this);
! 118: while (va_arg(args, char*))
! 119: {
! 120: i++;
! 121: }
! 122: va_end(args);
! 123: INIT_EXTRA(e, sizeof(char*) * i,
! 124: .public = {
! 125: .enumerate = enumerator_enumerate_default,
! 126: .venumerate = _section_enumerator_enumerate,
! 127: .destroy = _section_enumerator_destroy,
! 128: },
! 129: );
! 130: i = 0;
! 131: va_start(args, this);
! 132: do
! 133: {
! 134: e->keywords[i] = va_arg(args, char*);
! 135: }
! 136: while (e->keywords[i++]);
! 137: va_end(args);
! 138:
! 139: /* load uci context */
! 140: e->ctx = uci_alloc_context();
! 141: if (uci_load(e->ctx, this->package, &e->package) != UCI_OK)
! 142: {
! 143: section_enumerator_destroy(e);
! 144: return NULL;
! 145: }
! 146: e->list = &e->package->sections;
! 147: e->current = list_to_element(e->list->next);
! 148: if (e->current->type != UCI_TYPE_SECTION)
! 149: {
! 150: section_enumerator_destroy(e);
! 151: return NULL;
! 152: }
! 153: return &e->public;
! 154: }
! 155:
! 156: METHOD(uci_parser_t, destroy, void,
! 157: private_uci_parser_t *this)
! 158: {
! 159: free(this->package);
! 160: free(this);
! 161: }
! 162:
! 163: /**
! 164: * Described in header.
! 165: */
! 166: uci_parser_t *uci_parser_create(char *package)
! 167: {
! 168: private_uci_parser_t *this;
! 169:
! 170: INIT(this,
! 171: .public = {
! 172: .create_section_enumerator = _create_section_enumerator,
! 173: .destroy = _destroy,
! 174: },
! 175: .package = strdup(package),
! 176: );
! 177:
! 178: return &this->public;
! 179: }
! 180:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>