X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fcontrol.c;h=3463de80b3baf0e6e817e1b96d62c9daf52e3297;hb=9ffea7c3315046ddcea2589656c13da5f5e0c076;hp=f541f982ddbc5ba9ef5eaac33b762da1ec093c7b;hpb=6cd4b62a62098566ed73d7662d22e29fc509b9f3;p=citadel.git diff --git a/citadel/control.c b/citadel/control.c index f541f982d..3463de80b 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-2019 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. @@ -42,6 +42,11 @@ struct legacy_ctrl_format { /* * Callback to get highest room number when rebuilding message base metadata + * + * sanity_diag_mode (can be set by -s flag at startup) may be: + * 0 = attempt to fix inconsistencies + * 1 = show inconsistencies but don't repair them, exit after complete + * 2 = show inconsistencies but don't repair them, continue execution */ void control_find_highest(struct ctdlroom *qrbuf, void *data) { @@ -50,16 +55,17 @@ 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")) - { - CtdlSetConfigLong("MMnextroom", qrbuf->QRnumber); - room_fixed = 1; + if (qrbuf->QRnumber > CtdlGetConfigLong("MMnextroom")) { + syslog(LOG_DEBUG, "control: fixing MMnextroom %ld > %ld , found in %s", + qrbuf->QRnumber, CtdlGetConfigLong("MMnextroom"), qrbuf->QRname + ); + if (!sanity_diag_mode) { + CtdlSetConfigLong("MMnextroom", qrbuf->QRnumber); + } } - CtdlGetRoom (&room, qrbuf->QRname); + CtdlGetRoom(&room, qrbuf->QRname); /* Load the message list */ cdbfr = cdb_fetch(CDB_MSGLISTS, &room.QRnumber, sizeof(long)); @@ -70,24 +76,19 @@ 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")) - { - CtdlSetConfigLong("MMhighest", msglist[c]); - message_fixed = 1; + if (num_msgs > 0) { + for (c=0; c CtdlGetConfigLong("MMhighest")) { + syslog(LOG_DEBUG, "control: fixing MMhighest %ld > %ld , found in %s", + msglist[c], CtdlGetConfigLong("MMhighest"), qrbuf->QRname + ); + if (!sanity_diag_mode) { + CtdlSetConfigLong("MMhighest", msglist[c]); + } } } } 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 +96,21 @@ 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) -{ - int user_fixed = 0; - - if (EachUser->usernum > CtdlGetConfigLong("MMnextuser")) - { - CtdlSetConfigLong("MMnextuser", EachUser->usernum); - user_fixed = 1; +void control_find_user(char *username, void *out_data) { + struct ctdluser EachUser; + + if (CtdlGetUser(&EachUser, username) != 0) { + return; + } + + if (EachUser.usernum > CtdlGetConfigLong("MMnextuser")) { + syslog(LOG_DEBUG, "control: fixing MMnextuser %ld > %ld , found in %s", + EachUser.usernum, CtdlGetConfigLong("MMnextuser"), EachUser.fullname + ); + if (!sanity_diag_mode) { + CtdlSetConfigLong("MMnextuser", EachUser.usernum); + } } - if(user_fixed) - syslog(LOG_INFO, "control: fixed user count"); } @@ -147,9 +151,15 @@ 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"); + if (sanity_diag_mode == 1) { + syslog(LOG_INFO, "control: sanity check diagnostic mode is active - exiting now"); + abort(); + } } @@ -313,8 +323,8 @@ void cmd_conf(char *argbuf) 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")); + cprintf("\n"); + cprintf("\n"); cprintf("%s\n", CtdlGetConfigStr("c_pager_program")); cprintf("%d\n", CtdlGetConfigInt("c_imap_keep_from")); cprintf("%d\n", CtdlGetConfigInt("c_xmpp_c2s_port")); @@ -533,10 +543,10 @@ void cmd_conf(char *argbuf) CtdlSetConfigInt("c_rbl_at_greeting", confbool(buf)); break; case 58: - CtdlSetConfigStr("c_master_user", buf); + /* niu */ break; case 59: - CtdlSetConfigStr("c_master_pass", buf); + /* niu */ break; case 60: CtdlSetConfigStr("c_pager_program", buf); @@ -633,7 +643,7 @@ void cmd_conf(char *argbuf) cprintf("%d %s|\n", CIT_OK, v); } else if ( (v) && (!strcasecmp(cmd, "LOADVAL")) ) { - cprintf("%d %d\n", BINARY_FOLLOWS, strlen(v)); + cprintf("%d %d\n", BINARY_FOLLOWS, (int)strlen(v)); client_write(v, strlen(v)); } else {