/*
* 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.
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));
return; /* No messages at all? No further action. */
}
- if (num_msgs>0)
- {
- for (c=0; c<num_msgs; c++)
- {
- if (msglist[c] > CtdlGetConfigLong("MMhighest"))
- {
+ if (num_msgs > 0) {
+ for (c=0; c<num_msgs; c++) {
+ if (msglist[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;
}
/*
* 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");
}
*/
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");
}
}
-/*
- * Cull the database logs by removing log files that are no longer needed.
- * Note: this code will be removed once we are confident that Berkeley DB can do this on its own.
- */
-void cdb_cull_logs(void)
-{
-#ifndef DB_LOG_AUTO_REMOVE
- u_int32_t flags;
- int ret;
- char **file, **list;
- char errmsg[SIZ];
-
- flags = DB_ARCH_ABS;
-
- /* Get the list of names. */
- if ((ret = dbenv->log_archive(dbenv, &list, flags)) != 0) {
- syslog(LOG_ERR, "db: cdb_cull_logs() %s", db_strerror(ret));
- return;
- }
-
- /* Print the list of names. */
- if (list != NULL) {
- for (file = list; *file != NULL; ++file) {
- syslog(LOG_DEBUG, "db: deleting log %s", *file);
- ret = unlink(*file);
- if (ret != 0) {
- snprintf(errmsg, sizeof(errmsg),
- " ** ERROR **\n \n \n "
- "Citadel was unable to delete the "
- "database log file '%s' because of the "
- "following error:\n \n %s\n \n"
- " This log file is no longer in use "
- "and may be safely deleted.\n", *file, strerror(errno));
- CtdlAideMessage(errmsg, "Database Warning Message");
- }
- }
- free(list);
- }
-#endif /* DB_LOG_AUTO_REMOVE */
-}
-
-
/*
* Request a checkpoint of the database. Called once per minute by the thread manager.
*/
/* After a successful checkpoint, we can cull the unused logs */
if (CtdlGetConfigInt("c_auto_cull")) {
-#ifdef DB_LOG_AUTO_REMOVE
- // This version of Berkeley DB can cull the logs on its own!
ret = dbenv->log_set_config(dbenv, DB_LOG_AUTO_REMOVE, 1);
-#else
- cdb_cull_logs(); // Citadel knows how to do it too.
-#endif
}
-#ifdef DB_LOG_AUTO_REMOVE
else {
ret = dbenv->log_set_config(dbenv, DB_LOG_AUTO_REMOVE, 0);
}
-#endif
}
/*
* Main source module for the Citadel 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.
cprintf(Reply, state, ScheduledShutdown);
}
-/*
- * Manually initiate log file cull.
- */
-void cmd_cull(char *argbuf) {
- if (CtdlAccessCheck(ac_internal)) return;
- cdb_cull_logs();
- cprintf("%d Database log file cull completed.\n", CIT_OK);
-}
-
-
/*****************************************************************************/
/* MODULE INITIALIZATION STUFF */
CtdlRegisterProtoHook(cmd_down, "DOWN", "perform a server shutdown");
CtdlRegisterProtoHook(cmd_halt, "HALT", "halt the server without exiting the server process");
CtdlRegisterProtoHook(cmd_scdn, "SCDN", "schedule or cancel a server shutdown");
- CtdlRegisterProtoHook(cmd_cull, "CULL", "Cull database logs");
}
/* return our id for the Log */
return "syscmd";