]> code.citadel.org Git - citadel.git/blobdiff - citadel/serv_test.c
* added RCS Id keyword strings to sources
[citadel.git] / citadel / serv_test.c
index 57002db5dc9eb0393e55b980bab934e2130b349a..f0496963ce9c43eb8a384d47605bb35c8f3b49cd 100644 (file)
@@ -1,3 +1,4 @@
+/* $Id$ */
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/time.h>
 #include <sys/wait.h>
 #include <string.h>
+#include <limits.h>
 #include <pthread.h>
 #include "citadel.h"
 #include "server.h"
 #include <syslog.h>
+#include <time.h>
 #include "sysdep_decls.h"
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
 #include "dynloader.h"
-
-symtab *My_Symtab = NULL;      /* dyn */
+#include "room_ops.h"
+#include "policy.h"
+#include "database.h"
+#include "msgbase.h"
 
 extern struct CitContext *ContextList;
 
@@ -27,46 +32,114 @@ extern struct CitContext *ContextList;
 #define MODULE_AUTHOR  "Art Cancro"
 #define MODULE_EMAIL   "ajc@uncnsrd.mt-kisco.ny.us"
 #define MAJOR_VERSION  0
-#define MINOR_VERSION  1
+#define MINOR_VERSION  3
+
+static struct DLModule_Info info = {
+       MODULE_NAME,
+       MODULE_AUTHOR,
+       MODULE_EMAIL,
+       MAJOR_VERSION,
+       MINOR_VERSION
+       };
 
 void CleanupTest(void) {
        lprintf(9, "--- test of adding an unload hook --- \n");
        }
 
-void NewRoomTest(char *RoomName) {
-       lprintf(9, "--- test module was told we're now in %s ---\n", RoomName);
+void NewRoomTest(void) {
+       lprintf(9, "--- test module was told we're now in %s ---\n",
+               CC->cs_room);
        }
 
-void SessionStartTest(int WhichSession) {
-       lprintf(9, "--- starting up session %d ---\n", WhichSession);
+void SessionStartTest(void) {
+       lprintf(9, "--- starting up session %d ---\n",
+               CC->cs_pid);
        }
 
-void SessionStopTest(int WhichSession) {
-       lprintf(9, "--- ending session %d ---\n", WhichSession);
+void SessionStopTest(void) {
+       lprintf(9, "--- ending session %d ---\n", 
+               CC->cs_pid);
        }
 
 void LoginTest(void) {
        lprintf(9, "--- Hello, %s ---\n", CC->curr_user);
        }
 
-void Dynamic_Module_Init(struct DLModule_Info *info)
-{
-   strncpy(info->module_name, MODULE_NAME, 30);
-   strncpy(info->module_author, MODULE_AUTHOR, 30);
-   strncpy(info->module_author_email, MODULE_EMAIL, 30);
-   info->major_version = MAJOR_VERSION;
-   info->minor_version = MINOR_VERSION;
 
-   CtdlRegisterCleanupHook(CleanupTest);
-   CtdlRegisterNewRoomHook(NewRoomTest);
-   CtdlRegisterSessionHook(SessionStartTest, 1);
-   CtdlRegisterSessionHook(SessionStopTest, 0);
-   CtdlRegisterLoginHook(LoginTest);
+void Ygorl(char *username, long usernum) {
+       if (!strcasecmp(username, "Hexslinger")) {
+               strcpy(username, "Flaming Asshole");
+               }
+       }
 
-}
 
-void Get_Symtab(symtab **the_symtab)
+
+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",
+               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;
+       if (epbuf.expire_mode == EXPIRE_MANUAL) return;
+
+       get_msglist(qrbuf);
+       
+       /* Nothing to do if there aren't any messages */
+       if (CC->num_msgs == 0) return;
+
+       /* If the room is set to expire by count, do that */
+       if (epbuf.expire_mode == EXPIRE_NUMMSGS) {
+               while (CC->num_msgs > epbuf.expire_value) {
+                       delnum = MessageFromList(0);
+                       lprintf(5, "Expiring message %ld\n", delnum);
+                       cdb_delete(CDB_MSGMAIN, &delnum, sizeof(long));
+                       memcpy(&CC->msglist[0], &CC->msglist[1],
+                               (sizeof(long)*(CC->num_msgs - 1)));
+                       CC->num_msgs = CC->num_msgs - 1;
+                       }
+               }
+
+       /* 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);
+       }
+
+void PurgeMessages(void) {
+       ForEachRoom(DoPurgeMessages);
+       }
+
+struct DLModule_Info *Dynamic_Module_Init(void)
 {
-   (*the_symtab) = My_Symtab;
-   return;
+   CtdlRegisterCleanupHook(CleanupTest);
+   CtdlRegisterCleanupHook(PurgeMessages);
+   CtdlRegisterSessionHook(NewRoomTest, EVT_NEWROOM);
+   CtdlRegisterSessionHook(SessionStartTest, EVT_START);
+   CtdlRegisterSessionHook(SessionStopTest, EVT_STOP);
+   CtdlRegisterSessionHook(LoginTest, EVT_LOGIN);
+   CtdlRegisterUserHook(Ygorl, EVT_OUTPUTMSG);
+   return &info;
 }