diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | module/conf.c | 25 | ||||
-rw-r--r-- | module/conf.h | 6 | ||||
-rw-r--r-- | module/p11-kit-lib.c | 8 | ||||
-rw-r--r-- | tests/Makefile.am | 13 | ||||
-rw-r--r-- | tests/conf-test.c | 121 | ||||
-rw-r--r-- | tests/files/test-1.conf | 6 |
7 files changed, 158 insertions, 22 deletions
@@ -37,3 +37,4 @@ temp.txt /tests/coverage /tests/coverage.info /tests/hash-test +/tests/conf-test diff --git a/module/conf.c b/module/conf.c index a0a3917..1e0d565 100644 --- a/module/conf.c +++ b/module/conf.c @@ -54,16 +54,19 @@ #include <unistd.h> static void -errmsg (const char *filename, const char* msg, ...) +errmsg (conf_error_func error_func, const char* msg, ...) { #define MAX_MSGLEN 1024 char buf[MAX_MSGLEN]; va_list ap; + if (!error_func) + return; + va_start (ap, msg); vsnprintf (buf, MAX_MSGLEN, msg, ap); buf[MAX_MSGLEN - 1] = 0; - conf_error (filename, buf); + error_func (buf); va_end (ap); } @@ -112,7 +115,8 @@ strtrim (char* data) */ static char* -read_config_file (const char* filename, int flags) +read_config_file (const char* filename, int flags, + conf_error_func error_func) { char* config = NULL; FILE* f = NULL; @@ -129,7 +133,7 @@ read_config_file (const char* filename, int flags) errno = ENOMEM; return config; } - errmsg (filename, "couldn't open config file: %s", filename); + errmsg (error_func, "couldn't open config file: %s", filename); return NULL; } @@ -137,19 +141,19 @@ read_config_file (const char* filename, int flags) if (fseek (f, 0, SEEK_END) == -1 || (len = ftell (f)) == -1 || fseek (f, 0, SEEK_SET) == -1) { - errmsg (filename, "couldn't seek config file: %s", filename); + errmsg (error_func, "couldn't seek config file: %s", filename); return NULL; } if ((config = (char*)malloc (len + 2)) == NULL) { - errmsg (filename, "out of memory"); + errmsg (error_func, "out of memory"); errno = ENOMEM; return NULL; } /* And read in one block */ if (fread (config, 1, len, f) != len) { - errmsg (filename, "couldn't read config file: %s", filename); + errmsg (error_func, "couldn't read config file: %s", filename); return NULL; } @@ -166,7 +170,8 @@ read_config_file (const char* filename, int flags) } hash_t* -conf_parse_file (const char* filename, int flags) +conf_parse_file (const char* filename, int flags, + conf_error_func error_func) { char *name; char *value; @@ -178,7 +183,7 @@ conf_parse_file (const char* filename, int flags) assert (filename); /* Adds an extra newline to end of file */ - config = read_config_file (filename, flags); + config = read_config_file (filename, flags, error_func); if (!config) return NULL; @@ -198,7 +203,7 @@ conf_parse_file (const char* filename, int flags) /* Look for the break between name = value on the same line */ value = name + strcspn (name, ":="); if (!*value) { - errmsg (filename, "%s: invalid config line: %s", filename, name); + errmsg (error_func, "%s: invalid config line: %s", filename, name); errno = EINVAL; break; } diff --git a/module/conf.h b/module/conf.h index 2a9e2f3..84138d2 100644 --- a/module/conf.h +++ b/module/conf.h @@ -42,10 +42,10 @@ enum { CONF_IGNORE_MISSING = 0x01, }; -extern void conf_error (const char *filename, - const char *message); +typedef void (*conf_error_func) (const char *message); hash_t* conf_parse_file (const char *filename, - int flags); + int flags, + conf_error_func error_func); #endif /* __CONF_H__ */ diff --git a/module/p11-kit-lib.c b/module/p11-kit-lib.c index 1b7a99c..a244203 100644 --- a/module/p11-kit-lib.c +++ b/module/p11-kit-lib.c @@ -101,8 +101,8 @@ warning (const char* msg, ...) va_end (va); } -void -conf_error (const char *filename, const char *buffer) +static void +conf_error (const char *buffer) { /* called from conf.c */ fprintf (stderr, "p11-kit: %s\n", buffer); @@ -184,7 +184,7 @@ load_module_from_config_unlocked (const char *configfile, const char *name) if (!module) return CKR_HOST_MEMORY; - module->config = conf_parse_file (configfile, 0); + module->config = conf_parse_file (configfile, 0, conf_error); if (!module->config) { free_module_unlocked (module); if (errno == ENOMEM) @@ -335,7 +335,7 @@ load_registered_modules_unlocked (void) assert (!gl.config); /* Load the main configuration */ - config = conf_parse_file (PKCS11_CONFIG_FILE, CONF_IGNORE_MISSING); + config = conf_parse_file (PKCS11_CONFIG_FILE, CONF_IGNORE_MISSING, conf_error); if (!config) { if (errno == ENOMEM) return CKR_HOST_MEMORY; diff --git a/tests/Makefile.am b/tests/Makefile.am index 56a5620..5c9e0e4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -2,16 +2,19 @@ INCLUDES = \ -I$(top_srcdir) \ -I$(top_srcdir)/module \ - -Icutest + -Icutest \ + -DSRCDIR=\"$(srcdir)\" noinst_PROGRAMS = \ - hash-test - -hash_test_SOURCES = \ - hash-test.c + hash-test \ + conf-test hash_test_LDADD = \ $(top_builddir)/module/libp11-kit-testable.la +conf_test_LDADD = \ + $(top_builddir)/module/libp11-kit-testable.la + check-am: ./hash-test + ./conf-test diff --git a/tests/conf-test.c b/tests/conf-test.c new file mode 100644 index 0000000..7ffece3 --- /dev/null +++ b/tests/conf-test.c @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2011, Collabora Ltd. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * * Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and + * the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * * The names of contributors to this software may not be + * used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * Author: Stef Walter <stefw@collabora.co.uk> + */ + +#include "config.h" +#include "CuTest.h" + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "conf.h" + +static int n_errors = 0; + +static void +error_func (const char *buffer) +{ + ++n_errors; +} + +static void +test_parse_conf_1 (CuTest *tc) +{ + hash_t *ht; + const char *value; + + ht = conf_parse_file (SRCDIR "/files/test-1.conf", 0, error_func); + CuAssertPtrNotNull (tc, ht); + + value = hash_get (ht, "key1"); + CuAssertStrEquals (tc, "value1", value); + + value = hash_get (ht, "with-colon"); + CuAssertStrEquals (tc, "value-of-colon", value); + + value = hash_get (ht, "with-whitespace"); + CuAssertStrEquals (tc, "value-with-whitespace", value); + + value = hash_get (ht, "embedded-comment"); + CuAssertStrEquals (tc, "this is # not a comment", value); + + hash_free (ht); +} + +static void +test_parse_ignore_missing (CuTest *tc) +{ + hash_t *ht; + + n_errors = 0; + ht = conf_parse_file (SRCDIR "/files/non-existant.conf", CONF_IGNORE_MISSING, error_func); + CuAssertPtrNotNull (tc, ht); + + CuAssertIntEquals (tc, 0, hash_count (ht)); + CuAssertIntEquals (tc, 0, n_errors); + hash_free (ht); +} + +static void +test_parse_fail_missing (CuTest *tc) +{ + hash_t *ht; + + n_errors = 0; + ht = conf_parse_file (SRCDIR "/files/non-existant.conf", 0, error_func); + CuAssertPtrEquals (tc, ht, NULL); + CuAssertIntEquals (tc, 1, n_errors); +} + +int +main (void) +{ + CuString *output = CuStringNew (); + CuSuite* suite = CuSuiteNew (); + int ret; + + SUITE_ADD_TEST (suite, test_parse_conf_1); + SUITE_ADD_TEST (suite, test_parse_ignore_missing); + SUITE_ADD_TEST (suite, test_parse_fail_missing); + + CuSuiteRun (suite); + CuSuiteSummary (suite, output); + CuSuiteDetails (suite, output); + printf ("%s\n", output->buffer); + ret = suite->failCount; + CuSuiteDelete (suite); + return ret; +} + +#include "CuTest.c" diff --git a/tests/files/test-1.conf b/tests/files/test-1.conf new file mode 100644 index 0000000..01193c6 --- /dev/null +++ b/tests/files/test-1.conf @@ -0,0 +1,6 @@ +key1=value1 +with-whitespace = value-with-whitespace +with-colon: value-of-colon + +# A comment +embedded-comment: this is # not a comment |