X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fcontrol.c;h=7cdf65d3bae8939a895529aab81a5564d1033f85;hb=322953f1b1f00cd3e644e195b14c816eedbada12;hp=f03aea7b35d4662a8f7eafc324525c4a4582383c;hpb=104a4e1d569154afc9ff6a218d76d42dd3870b7b;p=citadel.git diff --git a/citadel/control.c b/citadel/control.c index f03aea7b3..7cdf65d3b 100644 --- a/citadel/control.c +++ b/citadel/control.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include "citadel.h" #include "server.h" @@ -41,11 +42,14 @@ #include "room_ops.h" #include "user_ops.h" #include "database.h" +#include "threads.h" #ifndef HAVE_SNPRINTF #include "snprintf.h" #endif +#include "ctdl_module.h" + struct CitControl CitControl; extern struct config config; FILE *control_fp = NULL; @@ -65,8 +69,8 @@ void lock_control(void) */ if (flock(fileno(control_fp), (LOCK_EX | LOCK_NB))) { - lprintf(CTDL_EMERG, "citserver: unable to lock %s.\n", file_citadel_control); - lprintf(CTDL_EMERG, "Is another citserver already running?\n"); + CtdlLogPrintf(CTDL_EMERG, "citserver: unable to lock %s.\n", file_citadel_control); + CtdlLogPrintf(CTDL_EMERG, "Is another citserver already running?\n"); exit(CTDLEXIT_CONTROL); } #endif @@ -82,10 +86,14 @@ 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 > CitControl.MMnextroom) + { CitControl.MMnextroom = qrbuf->QRnumber; + room_fixed = 1; + } getroom (&room, qrbuf->QRname); @@ -103,10 +111,17 @@ void control_find_highest(struct ctdlroom *qrbuf, void *data) for (c=0; c CitControl.MMhighest) + { CitControl.MMhighest = msglist[c]; + message_fixed = 1; + } } } cdb_free(cdbfr); + if (room_fixed) + CtdlLogPrintf(CTDL_INFO, "Control record checking....Fixed room counter\n"); + if (message_fixed) + CtdlLogPrintf(CTDL_INFO, "Control record checking....Fixed message count\n"); return; } @@ -117,8 +132,15 @@ void control_find_highest(struct ctdlroom *qrbuf, void *data) void control_find_user (struct ctdluser *EachUser, void *out_data) { + int user_fixed = 0; + if (EachUser->usernum > CitControl.MMnextuser) + { CitControl.MMnextuser = EachUser->usernum; + user_fixed = 1; + } + if(user_fixed) + CtdlLogPrintf(CTDL_INFO, "Control record checking....Fixed user count\n"); } @@ -128,6 +150,7 @@ void control_find_user (struct ctdluser *EachUser, void *out_data) void get_control(void) { static int already_have_control = 0; + int rv = 0; /* * If we already have the control record in memory, there's no point @@ -144,33 +167,31 @@ void get_control(void) control_fp = fopen(file_citadel_control, "rb+"); if (control_fp != NULL) { lock_control(); - fchown(fileno(control_fp), config.c_ctdluid, -1); + rv = fchown(fileno(control_fp), config.c_ctdluid, -1); + rv = fchmod(fileno(control_fp), S_IRUSR|S_IWUSR); } } if (control_fp == NULL) { control_fp = fopen(file_citadel_control, "wb+"); if (control_fp != NULL) { lock_control(); - fchown(fileno(control_fp), config.c_ctdluid, -1); + rv = fchown(fileno(control_fp), config.c_ctdluid, -1); + rv = fchmod(fileno(control_fp), S_IRUSR|S_IWUSR); memset(&CitControl, 0, sizeof(struct CitControl)); - // Find highest room number and message number. - ForEachRoom(control_find_highest, NULL); - ForEachUser(control_find_user, NULL); - fwrite(&CitControl, sizeof(struct CitControl), - 1, control_fp); + rv = fwrite(&CitControl, sizeof(struct CitControl), 1, control_fp); rewind(control_fp); } } if (control_fp == NULL) { - lprintf(CTDL_ALERT, "ERROR opening %s: %s\n", - file_citadel_control, - strerror(errno)); + CtdlLogPrintf(CTDL_ALERT, "ERROR opening %s: %s\n", file_citadel_control, strerror(errno)); return; } rewind(control_fp); - fread(&CitControl, sizeof(struct CitControl), 1, control_fp); + rv = fread(&CitControl, sizeof(struct CitControl), 1, control_fp); already_have_control = 1; + rv = chown(file_citadel_control, config.c_ctdluid, (-1)); + } /* @@ -178,15 +199,30 @@ void get_control(void) */ void put_control(void) { + int rv = 0; if (control_fp != NULL) { rewind(control_fp); - fwrite(&CitControl, sizeof(struct CitControl), 1, - control_fp); + rv = fwrite(&CitControl, sizeof(struct CitControl), 1, control_fp); fflush(control_fp); } } + +/* + * check_control - check the control record has sensible values for message, user and room numbers + */ +void check_control(void) +{ + CtdlLogPrintf(CTDL_INFO, "Checking/re-building control record\n"); + get_control(); + // Find highest room number and message number. + ForEachRoom(control_find_highest, NULL); + ForEachUser(control_find_user, NULL); + put_control(); +} + + /** * release_control - close our fd on exit */ @@ -212,6 +248,23 @@ long get_new_message_number(void) } +/* + * CtdlGetCurrentMessageNumber() - Obtain the current highest message number in the system + * This provides a quick way to initialise a variable that might be used to indicate + * messages that should not be processed. EG. a new Sieve script will use this + * to record determine that messages older than this should not be processed. + */ +long CtdlGetCurrentMessageNumber(void) +{ + long retval = 0L; + begin_critical_section(S_CONTROL); + get_control(); + retval = CitControl.MMhighest; + end_critical_section(S_CONTROL); + return(retval); +} + + /* * get_new_user_number() - Obtain a new, unique ID to be used for a user. */ @@ -332,6 +385,9 @@ void cmd_conf(char *argbuf) cprintf("%d\n", config.c_imap_keep_from); cprintf("%d\n", config.c_xmpp_c2s_port); cprintf("%d\n", config.c_xmpp_s2s_port); + cprintf("%ld\n", config.c_pop3_fetch); + cprintf("%ld\n", config.c_pop3_fastest); + cprintf("%d\n", config.c_spam_flag_only); cprintf("000\n"); } @@ -339,7 +395,7 @@ void cmd_conf(char *argbuf) unbuffer_output(); cprintf("%d Send configuration...\n", SEND_LISTING); a = 0; - while (client_getln(buf, sizeof buf), strcmp(buf, "000")) { + while (client_getln(buf, sizeof buf) >= 0 && strcmp(buf, "000")) { switch (a) { case 0: safestrncpy(config.c_nodename, buf, @@ -579,6 +635,15 @@ void cmd_conf(char *argbuf) case 63: config.c_xmpp_s2s_port = atoi(buf); break; + case 64: + config.c_pop3_fetch = atol(buf); + break; + case 65: + config.c_pop3_fastest = atol(buf); + break; + case 66: + config.c_spam_flag_only = atoi(buf); + break; } ++a; } @@ -630,3 +695,16 @@ void cmd_conf(char *argbuf) ERROR + ILLEGAL_VALUE); } } + + +/*****************************************************************************/ +/* MODULE INITIALIZATION STUFF */ +/*****************************************************************************/ + + +CTDL_MODULE_INIT(control) +{ + CtdlRegisterProtoHook(cmd_conf, "CONF", "Autoconverted. TODO: document me."); + /* return our Subversion id for the Log */ + return "$Id$"; +}