X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fcontrol.c;h=ff4c0ea80224f4fc003738b5af5df956f49b41f4;hb=6f9208392ee576a322edbc389c32d27ceaa3c04f;hp=fce46a00cefdbd317a1ca2b76f60f4cb437b7fe7;hpb=4df5a681fce2bd93f8b81e0873c0f173ca14616d;p=citadel.git diff --git a/citadel/control.c b/citadel/control.c index fce46a00c..ff4c0ea80 100644 --- a/citadel/control.c +++ b/citadel/control.c @@ -1,7 +1,7 @@ /* * This module handles states which are global to the entire server. * - * Copyright (c) 1987-2017 by the citadel.org team + * Copyright (c) 1987-2018 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3. @@ -50,16 +50,13 @@ void control_find_highest(struct ctdlroom *qrbuf, void *data) long *msglist; int num_msgs=0; int c; - int room_fixed = 0; - int message_fixed = 0; - if (qrbuf->QRnumber > CtdlGetConfigLong("MMnextroom")) - { + if (qrbuf->QRnumber > CtdlGetConfigLong("MMnextroom")) { + syslog(LOG_DEBUG, "control: fixing MMnextroom %ld > %ld", qrbuf->QRnumber, CtdlGetConfigLong("MMnextroom")); CtdlSetConfigLong("MMnextroom", qrbuf->QRnumber); - room_fixed = 1; } - CtdlGetRoom (&room, qrbuf->QRname); + CtdlGetRoom(&room, qrbuf->QRname); /* Load the message list */ cdbfr = cdb_fetch(CDB_MSGLISTS, &room.QRnumber, sizeof(long)); @@ -70,24 +67,15 @@ void control_find_highest(struct ctdlroom *qrbuf, void *data) return; /* No messages at all? No further action. */ } - if (num_msgs>0) - { - for (c=0; c CtdlGetConfigLong("MMhighest")) - { + if (num_msgs > 0) { + for (c=0; c CtdlGetConfigLong("MMhighest")) { + syslog(LOG_DEBUG, "control: fixing MMhighest %ld > %ld", msglist[c], CtdlGetConfigLong("MMhighest")); CtdlSetConfigLong("MMhighest", msglist[c]); - message_fixed = 1; } } } cdb_free(cdbfr); - if (room_fixed) { - syslog(LOG_INFO, "control: fixed room counter"); - } - if (message_fixed) { - syslog(LOG_INFO, "control: fixed message count"); - } return; } @@ -95,18 +83,12 @@ void control_find_highest(struct ctdlroom *qrbuf, void *data) /* * Callback to get highest user number. */ - -void control_find_user (struct ctdluser *EachUser, void *out_data) +void control_find_user(struct ctdluser *EachUser, void *out_data) { - int user_fixed = 0; - - if (EachUser->usernum > CtdlGetConfigLong("MMnextuser")) - { + if (EachUser->usernum > CtdlGetConfigLong("MMnextuser")) { + syslog(LOG_DEBUG, "control: fixing MMnextuser %ld > %ld", EachUser->usernum, CtdlGetConfigLong("MMnextuser")); CtdlSetConfigLong("MMnextuser", EachUser->usernum); - user_fixed = 1; } - if(user_fixed) - syslog(LOG_INFO, "control: fixed user count"); } @@ -147,9 +129,11 @@ void migrate_legacy_control_record(void) */ void check_control(void) { - syslog(LOG_INFO, "control: sanity checking the recorded highest message, user, and room numbers"); + syslog(LOG_INFO, "control: sanity checking the recorded highest message and room numbers"); CtdlForEachRoom(control_find_highest, NULL); + syslog(LOG_INFO, "control: sanity checking the recorded highest user number"); ForEachUser(control_find_user, NULL); + syslog(LOG_INFO, "control: sanity checks complete"); } @@ -308,10 +292,10 @@ void cmd_conf(char *argbuf) cprintf("%d\n", CtdlGetConfigInt("c_pftcpdict_port")); cprintf("%d\n", CtdlGetConfigInt("c_managesieve_port")); cprintf("%d\n", CtdlGetConfigInt("c_auth_mode")); - cprintf("%s\n", CtdlGetConfigStr("c_funambol_host")); - cprintf("%d\n", CtdlGetConfigInt("c_funambol_port")); - cprintf("%s\n", CtdlGetConfigStr("c_funambol_source")); - cprintf("%s\n", CtdlGetConfigStr("c_funambol_auth")); + cprintf("\n"); + cprintf("\n"); + cprintf("\n"); + cprintf("\n"); cprintf("%d\n", CtdlGetConfigInt("c_rbl_at_greeting")); cprintf("%s\n", CtdlGetConfigStr("c_master_user")); cprintf("%s\n", CtdlGetConfigStr("c_master_pass")); @@ -518,16 +502,16 @@ void cmd_conf(char *argbuf) CtdlSetConfigInt("c_auth_mode", atoi(buf)); break; case 53: - CtdlSetConfigStr("c_funambol_host", buf); + /* niu */ break; case 54: - CtdlSetConfigInt("c_funambol_port", atoi(buf)); + /* niu */ break; case 55: - CtdlSetConfigStr("c_funambol_source", buf); + /* niu */ break; case 56: - CtdlSetConfigStr("c_funambol_auth", buf); + /* niu */ break; case 57: CtdlSetConfigInt("c_rbl_at_greeting", confbool(buf)); @@ -619,24 +603,29 @@ void cmd_conf(char *argbuf) extract_token(confname, argbuf, 1, '|', sizeof confname); unbuffer_output(); cprintf("%d %s\n", SEND_LISTING, confname); - confptr = CtdlReadMessageBody(HKEY("000"), CtdlGetConfigLong("c_maxmsglen"), NULL, 0, 0); + confptr = CtdlReadMessageBody(HKEY("000"), CtdlGetConfigLong("c_maxmsglen"), NULL, 0); CtdlPutSysConfig(confname, confptr); free(confptr); } // 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, (int)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 +638,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 +665,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");