MINOR: ssl/ckch: add substring parser for ckch_conf

Add a substring parser for the ckch_conf keyword parser, this will split
a string into multiple substring, and strdup them in a array.
This commit is contained in:
William Lallemand 2025-03-20 22:44:53 +01:00
parent fa01c9d92b
commit fdcb97614c
2 changed files with 50 additions and 2 deletions

View File

@ -183,8 +183,9 @@ struct cert_exts {
enum parse_type_t {
PARSE_TYPE_NONE = 0,
PARSE_TYPE_INT,
PARSE_TYPE_STR, /* string which is strdup() */
PARSE_TYPE_ONOFF, /* "on" or "off" keyword */
PARSE_TYPE_STR, /* string which is strdup() */
PARSE_TYPE_ARRAY_SUBSTR, /* string splitted by colons into an array of substring */
PARSE_TYPE_ONOFF, /* "on" or "off" keyword */
};
struct ckch_conf_kws {

View File

@ -4801,6 +4801,53 @@ int ckch_conf_parse(char **args, int cur_arg, struct ckch_conf *f, int *found, c
err_code |= ERR_ALERT | ERR_ABORT;
goto out;
}
} else if (ckch_conf_kws[i].type == PARSE_TYPE_ARRAY_SUBSTR) {
char ***t = target;
char **r = NULL;
int n = 0;
char *b, *e;
/* split a string into substring splitted by colons */
e = b = args[cur_arg + 1];
do {
while (*e != ',' && *e != '\0')
e++;
r = realloc(r, sizeof(char *) * (n + 2));
if (!r) {
ha_alert("parsing [%s:%d]: out of memory.\n", file, linenum);
err_code |= ERR_ALERT | ERR_ABORT;
goto out;
}
r[n] = strndup(b, e - b);
if (!r[n]) {
ha_alert("parsing [%s:%d]: out of memory.\n", file, linenum);
err_code |= ERR_ALERT | ERR_ABORT;
goto out;
}
n++;
if (*e == '\0')
break;
e++; /* skip the separator */
/* skip trailing spaces */
while (*e == ' ')
e++;
b = e;
} while (*b);
r[n] = NULL; /* last element is NULL */
*t = r;
// debug
// while (*r)
// fprintf(stderr, "sub: \"%s\"\n", *r++);
} else if (ckch_conf_kws[i].type == PARSE_TYPE_INT) {
int *t = target;
char *stop;