From 063551568b020ba21cf4252222ac4570f3fda5b1 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 2 Nov 1998 00:43:39 +0000 Subject: [PATCH] * Implemented message expiry by date (this really needs to be moved out of serv_test.c, but where does it belong?) --- citadel/ChangeLog | 2 ++ citadel/citadel.h | 1 + citadel/msgbase.c | 50 ++++++++++++++++++++++++++++++++------------- citadel/msgbase.h | 2 +- citadel/serv_test.c | 25 ++++++++++++++++++++--- 5 files changed, 62 insertions(+), 18 deletions(-) diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 7dc1e8edc..19c2cf4ef 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,5 +1,7 @@ Sun Nov 1 18:47:42 EST 1998 Art Cancro * serv_upgrade.c: cosmetic changes + * Implemented message expiry by date (this really needs to be moved + out of serv_test.c, but where does it belong?) 1998-11-01 Nathan Bryant * serv_upgrade.c: warning fixes diff --git a/citadel/citadel.h b/citadel/citadel.h index 118788c42..4c22bfb5c 100644 --- a/citadel/citadel.h +++ b/citadel/citadel.h @@ -240,6 +240,7 @@ struct floor { #define MT_CITADEL 0 /* Citadel proprietary */ #define MT_RFC822 2 /* RFC822 */ #define MT_RAW 3 /* IGnet raw format */ +#define MT_DATE 4 /* We're only looking for the date */ diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 9b825fbb2..c683a6bdf 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -309,10 +309,10 @@ FMTEND: cprintf("\n"); /* - * get a message off disk. + * Get a message off disk. (return value is the message's timestamp) * */ -void output_message(char *msgid, int mode, +time_t output_message(char *msgid, int mode, int headers_only, int desired_section) { long msg_num; int a; @@ -334,16 +334,16 @@ void output_message(char *msgid, int mode, char snode[256]; char lnode[256]; char mid[256]; - time_t xtime; + time_t xtime = 0L; /* */ strcpy(boundary, ""); msg_num = atol(msgid); - if ((!(CC->logged_in))&&(!(CC->internal_pgm))) { + if ((!(CC->logged_in))&&(!(CC->internal_pgm))&&(mode!=MT_DATE)) { cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN); - return; + return(xtime); } /* We used to need to check in the current room's message list @@ -362,17 +362,20 @@ void output_message(char *msgid, int mode, } if (!msg_ok) { - cprintf("%d Message %ld is not in this room.\n", - ERROR, msg_num); - return; + if (mode != MT_DATE) + cprintf("%d Message %ld is not in this room.\n", + ERROR, msg_num); + return(xtime); } dmsgtext = cdb_fetch(CDB_MSGMAIN, &msg_num, sizeof(long)); if (dmsgtext == NULL) { - cprintf("%d Can't find message %ld\n", ERROR+INTERNAL_ERROR); - return; + if (mode != MT_DATE) + cprintf("%d Can't find message %ld\n", + ERROR+INTERNAL_ERROR); + return(xtime); } msg_len = (long) dmsgtext->len; @@ -383,7 +386,7 @@ void output_message(char *msgid, int mode, cprintf("%d %ld\n", BINARY_FOLLOWS, msg_len); client_write(dmsgtext->ptr, (int) msg_len); cdb_free(dmsgtext); - return; + return(xtime); } /* Otherwise, we'll start parsing it field by field... */ @@ -392,12 +395,29 @@ void output_message(char *msgid, int mode, cprintf("%d Illegal message format on disk\n", ERROR+INTERNAL_ERROR); cdb_free(dmsgtext); - return; + return(xtime); } anon_flag = *mptr++; format_type = *mptr++; + /* Are we just looking for the message date? */ + if (mode == MT_DATE) while(ch = *mptr++, (ch!='M' && ch!=0)) { + buf[0] = 0; + do { + buf[strlen(buf)+1] = 0; + rch = *mptr++; + buf[strlen(buf)] = rch; + } while (rch > 0); + + if (ch=='T') { + xtime = atol(buf); + cdb_free(dmsgtext); + return(xtime); + } + } + + /* now for the user-mode message reading loops */ cprintf("%d Message %ld:\n",LISTING_FOLLOWS,msg_num); @@ -495,7 +515,7 @@ void output_message(char *msgid, int mode, if (ch==0) { cprintf("text\n*** ?Message truncated\n000\n"); cdb_free(dmsgtext); - return; + return(xtime); } if (headers_only) { @@ -507,7 +527,7 @@ void output_message(char *msgid, int mode, cprintf("mlen=%ld\n", msg_len); cprintf("000\n"); cdb_free(dmsgtext); - return; + return(xtime); } /* signify start of msg text */ @@ -555,6 +575,7 @@ void output_message(char *msgid, int mode, /* now we're done */ cprintf("000\n"); cdb_free(dmsgtext); + return(xtime); } @@ -572,6 +593,7 @@ void cmd_msg0(char *cmdbuf) desired_section = extract_int(cmdbuf, 2); output_message(msgid,MT_CITADEL, headers_only, desired_section); + return; } diff --git a/citadel/msgbase.h b/citadel/msgbase.h index c1708fb57..0c4232066 100644 --- a/citadel/msgbase.h +++ b/citadel/msgbase.h @@ -4,7 +4,7 @@ void cmd_msgs (char *cmdbuf); void help_subst (char *strbuf, char *source, char *dest); void do_help_subst (char *buffer); void memfmout (int width, char *mptr, char subst); -void output_message (char *msgid, int mode, +time_t output_message (char *msgid, int mode, int headers_only, int desired_section); void cmd_msg0 (char *cmdbuf); void cmd_msg2 (char *cmdbuf); diff --git a/citadel/serv_test.c b/citadel/serv_test.c index 758ce19f5..bec09516f 100644 --- a/citadel/serv_test.c +++ b/citadel/serv_test.c @@ -14,6 +14,7 @@ #include "citadel.h" #include "server.h" #include +#include #include "sysdep_decls.h" #include "citserver.h" #include "support.h" @@ -22,6 +23,7 @@ #include "room_ops.h" #include "policy.h" #include "database.h" +#include "msgbase.h" extern struct CitContext *ContextList; @@ -74,11 +76,16 @@ void Ygorl(char *username, long usernum) { void DoPurgeMessages(struct quickroom *qrbuf) { struct ExpirePolicy epbuf; long delnum; + time_t xtime, now; + char msgid[64]; + int a; + time(&now); GetExpirePolicy(&epbuf, qrbuf); - lprintf(9, "ExpirePolicy for <%s> is <%d> <%d>\n", + /* lprintf(9, "ExpirePolicy for <%s> is <%d> <%d>\n", qrbuf->QRname, epbuf.expire_mode, epbuf.expire_value); + */ /* If the room is set to never expire messages ... do nothing */ if (epbuf.expire_mode == EXPIRE_NEXTLEVEL) return; @@ -101,10 +108,22 @@ void DoPurgeMessages(struct quickroom *qrbuf) { } } - /* If the room is set to expire by age... FIX (write this!!) */ + /* If the room is set to expire by age... */ if (epbuf.expire_mode == EXPIRE_AGE) { + for (a=0; a<(CC->num_msgs); ++a) { + delnum = MessageFromList(a); + sprintf(msgid, "%ld", delnum); + xtime = output_message(msgid, MT_DATE, 0, 0); + + if ((xtime > 0L) + && (now - xtime > (time_t)(epbuf.expire_value * 86400L))) { + cdb_delete(CDB_MSGMAIN, &delnum, sizeof(long)); + SetMessageInList(a, 0L); + lprintf(5, "Expiring message %ld\n", delnum); + } + } } - + CC->num_msgs = sort_msglist(CC->msglist, CC->num_msgs); put_msglist(qrbuf); } -- 2.39.2