From c749167bf53f218f691fc7e5af69520053319b7f Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Sat, 8 Apr 2017 00:01:04 -0400 Subject: [PATCH] CONF LOADVAL and CONF STOREVAL to handle configuration variables with length greater than 1 KB --- citadel/control.c | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/citadel/control.c b/citadel/control.c index 077809178..ef9a27fed 100644 --- a/citadel/control.c +++ b/citadel/control.c @@ -625,18 +625,23 @@ void cmd_conf(char *argbuf) } // CONF GETVAL - retrieve configuration variables from the database - else if (!strcasecmp(cmd, "GETVAL")) { + // CONF LOADVAL - same thing but can handle variables bigger than 1 KB + else if ( (!strcasecmp(cmd, "GETVAL")) || (!strcasecmp(cmd, "LOADVAL")) ) { extract_token(confname, argbuf, 1, '|', sizeof confname); char *v = CtdlGetConfigStr(confname); - if (v) { + if ( (v) && (!strcasecmp(cmd, "GETVAL")) ) { cprintf("%d %s|\n", CIT_OK, v); } + else if ( (v) && (!strcasecmp(cmd, "LOADVAL")) ) { + cprintf("%d %d\n", BINARY_FOLLOWS, strlen(v)); + client_write(v, strlen(v)); + } else { cprintf("%d |\n", ERROR); } } - // CONF PUTVAL - store configuration variables from the database + // CONF PUTVAL - store configuration variables in the database else if (!strcasecmp(cmd, "PUTVAL")) { if (num_tokens(argbuf, '|') < 3) { cprintf("%d name and value required\n", ERROR); @@ -649,6 +654,23 @@ void cmd_conf(char *argbuf) } } + // CONF STOREVAL - store configuration variables in the database bigger than 1 KB + else if (!strcasecmp(cmd, "STOREVAL")) { + if (num_tokens(argbuf, '|') < 3) { + cprintf("%d name and length required\n", ERROR); + } + else { + extract_token(confname, argbuf, 1, '|', sizeof confname); + int bytes = extract_int(argbuf, 2); + char *valbuf = malloc(bytes + 1); + cprintf("%d %d\n", SEND_BINARY, bytes); + client_read(valbuf, bytes); + valbuf[bytes+1] = 0; + CtdlSetConfigStr(confname, valbuf); + free(valbuf); + } + } + // CONF LISTVAL - list configuration variables in the database and their values else if (!strcasecmp(cmd, "LISTVAL")) { struct cdbdata *cdbcfg; @@ -659,10 +681,12 @@ void cmd_conf(char *argbuf) cprintf("%d all configuration variables\n", LISTING_FOLLOWS); cdb_rewind(CDB_CONFIG); while (cdbcfg = cdb_next_item(CDB_CONFIG), cdbcfg != NULL) { - keylen = strlen(cdbcfg->ptr); - key = cdbcfg->ptr; - value = cdbcfg->ptr + keylen + 1; - cprintf("%s|%s\n", key, value); + if (cdbcfg->len < 1020) { + keylen = strlen(cdbcfg->ptr); + key = cdbcfg->ptr; + value = cdbcfg->ptr + keylen + 1; + cprintf("%s|%s\n", key, value); + } cdb_free(cdbcfg); } cprintf("000\n"); -- 2.30.2