#include "citserver.h"
#include "support.h"
#include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
#include "room_ops.h"
#include "policy.h"
#include "database.h"
long msgnum;
};
+struct UPurgeList {
+ struct UPurgeList *next;
+ char up_key[SIZ];
+};
+
struct PurgeList *UserPurgeList = NULL;
struct PurgeList *RoomPurgeList = NULL;
while (RoomPurgeList != NULL) {
if (getroom(&qrbuf, RoomPurgeList->name) == 0) {
transcript=reallok(transcript, strlen(transcript)+SIZ);
- sprintf(&transcript[strlen(transcript)], " %s\n",
+ snprintf(&transcript[strlen(transcript)], SIZ, " %s\n",
qrbuf.QRname);
delete_room(&qrbuf);
}
struct quickroom qrbuf;
char mailboxname[ROOMNAMELEN];
MailboxName(mailboxname, us, MAILROOM);
- create_room(mailboxname, 4, "", 0, 1);
+ create_room(mailboxname, 4, "", 0, 1, 1);
if (getroom(&qrbuf, mailboxname) != 0) return;
lprintf(9, "Got %s\n", qrbuf.QRname);
*/
while (UserPurgeList != NULL) {
transcript=reallok(transcript, strlen(transcript)+SIZ);
- sprintf(&transcript[strlen(transcript)], " %s\n",
+ snprintf(&transcript[strlen(transcript)], SIZ, " %s\n",
UserPurgeList->name);
purge_user(UserPurgeList->name);
pptr = UserPurgeList->next;
int purged = 0;
struct cdbdata *cdbut;
struct UseTable ut;
+ struct UPurgeList *ul = NULL;
+ struct UPurgeList *uptr;
- /* Traverse through the table, purging old records... */
+ /* Phase 1: traverse through the table, discovering old records... */
+ lprintf(9, "Purge use table: phase 1\n");
cdb_rewind(CDB_USETABLE);
while(cdbut = cdb_next_item(CDB_USETABLE), cdbut != NULL) {
cdb_free(cdbut);
if ( (time(NULL) - ut.ut_timestamp) > USETABLE_RETAIN ) {
- cdb_delete(CDB_USETABLE, ut.ut_msgid,
- strlen(ut.ut_msgid) );
+ uptr = (struct UPurgeList *) mallok(sizeof(struct UPurgeList));
+ if (uptr != NULL) {
+ uptr->next = ul;
+ safestrncpy(uptr->up_key, ut.ut_msgid, SIZ);
+ ul = uptr;
+ }
++purged;
}
}
+ /* Phase 2: delete the records */
+ lprintf(9, "Purge use table: phase 2\n");
+ while (ul != NULL) {
+ cdb_delete(CDB_USETABLE, ul->up_key, strlen(ul->up_key));
+ uptr = ul->next;
+ phree(ul);
+ ul = uptr;
+ }
+
+ lprintf(9, "Purge use table: finished (purged %d records)\n", purged);
return(purged);
}
extract(cmd, argbuf, 0);
if (!strcasecmp(cmd, "users")) {
retval = PurgeUsers();
- cprintf("%d Purged %d users.\n", OK, retval);
+ cprintf("%d Purged %d users.\n", CIT_OK, retval);
return;
}
else if (!strcasecmp(cmd, "messages")) {
PurgeMessages();
- cprintf("%d Expired %d messages.\n", OK, messages_purged);
+ cprintf("%d Expired %d messages.\n", CIT_OK, messages_purged);
return;
}
else if (!strcasecmp(cmd, "rooms")) {
retval = PurgeRooms();
- cprintf("%d Expired %d rooms.\n", OK, retval);
+ cprintf("%d Expired %d rooms.\n", CIT_OK, retval);
return;
}
else if (!strcasecmp(cmd, "visits")) {
retval = PurgeVisits();
- cprintf("%d Purged %d visits.\n", OK, retval);
+ cprintf("%d Purged %d visits.\n", CIT_OK, retval);
}
else if (!strcasecmp(cmd, "usetable")) {
retval = PurgeUseTable();
cprintf("%d Purged %d entries from the use table.\n",
- OK, retval);
+ CIT_OK, retval);
}
else if (!strcasecmp(cmd, "defrag")) {
defrag_databases();
- cprintf("%d Defragmented the databases.\n", OK);
+ cprintf("%d Defragmented the databases.\n", CIT_OK);
}
else {
cprintf("%d Invalid command.\n", ERROR+ILLEGAL_VALUE);
void do_fsck_room(struct quickroom *qrbuf, void *data)
{
getroom(&CC->quickroom, qrbuf->QRname);
- CtdlForEachMessage(MSGS_ALL, 0L, (-127), NULL, NULL,
- do_fsck_msg, NULL);
+ CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, do_fsck_msg, NULL);
}
/*
/*****************************************************************************/
-char *Dynamic_Module_Init(void)
+char *serv_expire_init(void)
{
CtdlRegisterProtoHook(cmd_expi, "EXPI", "Expire old system objects");
CtdlRegisterProtoHook(cmd_fsck, "FSCK", "Check message ref counts");