From 46dc270ca4fcb0f23ac92d32d54b1eb8f726b70a Mon Sep 17 00:00:00 2001 From: venaas Date: Thu, 11 Sep 2008 12:07:58 +0000 Subject: [PATCH] allow %hex notation for strings in gconfig git-svn-id: https://svn.testnett.uninett.no/radsecproxy/branches/release-1.1@374 e88ac4ed-0b26-0410-9574-a7f39faa03bf --- gconfig.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/gconfig.c b/gconfig.c index 1984c6e..636fcca 100644 --- a/gconfig.c +++ b/gconfig.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include "debug.h" @@ -234,6 +235,28 @@ void getconfigline(struct gconffile **cf, char *block, char **opt, char **val, i return; } +uint8_t hexdigit2int(char d) { + if (d >= '0' && d <= '9') + return d - '0'; + if (d >= 'a' && d <= 'f') + return 10 + d - 'a'; + if (d >= 'A' && d <= 'F') + return 10 + d - 'A'; + return 0; +} + +void unhex(char *s) { + char *t; + for (t = s; *t; s++) { + if (*t == '%' && isxdigit(t[1]) && isxdigit(t[2])) { + *s = 16 * hexdigit2int(t[1]) + hexdigit2int(t[2]); + t += 3; + } else + *s = *t++; + } + *s = '\0'; +} + void getgenericconfig(struct gconffile **cf, char *block, ...) { va_list ap; char *opt = NULL, *val, *word, *optval, **str = NULL, ***mstr = NULL, *endptr; @@ -307,6 +330,7 @@ void getgenericconfig(struct gconffile **cf, char *block, ...) { case CONF_STR: if (*str) debugx(1, DBG_ERR, "configuration error, option %s already set to %s", opt, *str); + unhex(val); *str = val; break; case CONF_MSTR: @@ -317,6 +341,7 @@ void getgenericconfig(struct gconffile **cf, char *block, ...) { *mstr = realloc(*mstr, sizeof(char *) * (n + 2)); if (!*mstr) debugx(1, DBG_ERR, "malloc failed"); + unhex(val); (*mstr)[n] = val; (*mstr)[n + 1] = NULL; break; -- 2.1.4