]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
Don't create a section in parse_section.
authorTobias Brunner <tobias@strongswan.org>
Thu, 11 Nov 2010 14:21:25 +0000 (15:21 +0100)
committerTobias Brunner <tobias@strongswan.org>
Fri, 3 Dec 2010 16:38:37 +0000 (17:38 +0100)
Just add subsections and values to the passed section.

src/libstrongswan/settings.c

index 228c6e377aae82ca545e9004a7847c85a78a7df4..034539491fe4a326112d2d32e7733c3e52a873a5 100644 (file)
@@ -449,6 +449,20 @@ METHOD(settings_t, create_key_value_enumerator, enumerator_t*,
                                        (void*)kv_filter, NULL, NULL);
 }
 
+/**
+ * create a section with the given name
+ */
+static section_t *section_create(char *name)
+{
+       section_t *this;
+       INIT(this,
+               .name = name,
+               .sections = linked_list_create(),
+               .kv = linked_list_create(),
+       );
+       return this;
+}
+
 /**
  * destroy a section
  */
@@ -456,7 +470,6 @@ static void section_destroy(section_t *this)
 {
        this->kv->destroy_function(this->kv, free);
        this->sections->destroy_function(this->sections, (void*)section_destroy);
-
        free(this);
 }
 
@@ -537,17 +550,11 @@ static char parse(char **text, char *skip, char *term, char *br, char **token)
 /**
  * Parse a section
  */
-static section_t* parse_section(char **text, char *name)
+static bool parse_section(char **text, section_t *section)
 {
-       section_t *sub, *section;
        bool finished = FALSE;
        char *key, *value, *inner;
 
-       section = malloc_thing(section_t);
-       section->name = name;
-       section->sections = linked_list_create();
-       section->kv = linked_list_create();
-
        while (!finished)
        {
                switch (parse(text, "\t\n ", "{=#", NULL, &key))
@@ -555,12 +562,15 @@ static section_t* parse_section(char **text, char *name)
                        case '{':
                                if (parse(text, "\t ", "}", "{", &inner))
                                {
-                                       sub = parse_section(&inner, key);
-                                       if (sub)
+                                       section_t *sub = section_create(key);
+                                       if (parse_section(&inner, sub))
                                        {
                                                section->sections->insert_last(section->sections, sub);
                                                continue;
                                        }
+                                       section_destroy(sub);
+                                       DBG1(DBG_LIB, "parsing subsection '%s' failed", key);
+                                       break;
                                }
                                DBG1(DBG_LIB, "matching '}' not found near %s", *text);
                                break;
@@ -582,10 +592,9 @@ static section_t* parse_section(char **text, char *name)
                                finished = TRUE;
                                continue;
                }
-               section_destroy(section);
-               return NULL;
+               return FALSE;
        }
-       return section;
+       return TRUE;
 }
 
 METHOD(settings_t, destroy, void,
@@ -646,11 +655,13 @@ settings_t *settings_create(char *file)
        fclose(fd);
 
        pos = this->text;
-       this->top = parse_section(&pos, NULL);
-       if (this->top == NULL)
+       this->top = section_create(NULL);
+       if (!parse_section(&pos, this->top))
        {
                free(this->text);
                this->text = NULL;
+               section_destroy(this->top);
+               this->top = NULL;
        }
        return &this->public;
 }