* Renamed "dynloader" to "serv_extensions" globally. We don't want people
authorArt Cancro <ajc@citadel.org>
Thu, 16 Jan 2003 03:41:46 +0000 (03:41 +0000)
committerArt Cancro <ajc@citadel.org>
Thu, 16 Jan 2003 03:41:46 +0000 (03:41 +0000)
  to think we have a dynamic loader, do we?  :)
* serv_*_init() is now declared in serv_extensions.h.  This is definitely the
  wrong place for it.  It's there temporarily until we decide on a new
  convention for server extensions.
* bootstrap: more reliable detection of Red Hat Linux 7.3 -- more specifically,
  fewer fireworks when the host system is *not* Red Hat Linux.

52 files changed:
citadel/ChangeLog
citadel/Makefile.in
citadel/bootstrap
citadel/citserver.c
citadel/citserver.h
citadel/clientsocket.c
citadel/config.c
citadel/config.h
citadel/control.c
citadel/database_sleepycat.c
citadel/dynloader.c [deleted file]
citadel/dynloader.h [deleted file]
citadel/file_ops.c
citadel/housekeeping.c
citadel/html.c
citadel/imap_fetch.c
citadel/imap_misc.c
citadel/imap_search.c
citadel/imap_store.c
citadel/internet_addressing.c
citadel/locate_host.c
citadel/mime_parser.c
citadel/msgbase.c
citadel/policy.c
citadel/room_ops.c
citadel/sendcommand.c
citadel/serv_bio.c
citadel/serv_calendar.c
citadel/serv_chat.c
citadel/serv_crypto.c
citadel/serv_expire.c
citadel/serv_extensions.c [new file with mode: 0644]
citadel/serv_extensions.h [new file with mode: 0644]
citadel/serv_imap.c
citadel/serv_inetcfg.c
citadel/serv_listsub.c
citadel/serv_mrtg.c
citadel/serv_netfilter.c
citadel/serv_network.c
citadel/serv_newuser.c
citadel/serv_pas2.c
citadel/serv_pop3.c
citadel/serv_rwho.c
citadel/serv_smtp.c
citadel/serv_spam.c
citadel/serv_test.c
citadel/serv_upgrade.c
citadel/serv_vandelay.c
citadel/serv_vcard.c
citadel/server_main.c
citadel/sysdep.c
citadel/user_ops.c

index 6fccc8d09ab2619361bc3b767a3b1d2cd1d6217d..d889817488b26ca53d46685d1d02c5ea030c3f48 100644 (file)
@@ -1,4 +1,13 @@
  $Log$
+ Revision 601.111  2003/01/16 03:41:45  ajc
+ * Renamed "dynloader" to "serv_extensions" globally.  We don't want people
+   to think we have a dynamic loader, do we?  :)
+ * serv_*_init() is now declared in serv_extensions.h.  This is definitely the
+   wrong place for it.  It's there temporarily until we decide on a new
+   convention for server extensions.
+ * bootstrap: more reliable detection of Red Hat Linux 7.3 -- more specifically,
+   fewer fireworks when the host system is *not* Red Hat Linux.
+
  Revision 601.110  2003/01/15 16:34:53  ajc
  * bootstrap: don't check /etc/redhat-release if it doesn't exist (which is
    the case on all non Red Hat Linux systems)
@@ -4381,3 +4390,4 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant <bryant@cs.usm.maine.edu>
 
 Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
        * Initial CVS import
+
index 1648bf18b19e8a914a79c4cf588a7ccc40628b63..b8ef01f2697419a6994119588b43900495be26d8 100644 (file)
@@ -80,7 +80,7 @@ DOMAIN=@DOMAIN@
 SOURCES=aidepost.c auth.c base64.c chkpwd.c citadel.c citadel_ipc.c \
        citmail.c citserver.c client_chat.c client_passwords.c \
        clientsocket.c commands.c config.c control.c $(DATABASE) \
-       $(DOMAIN) dynloader.c file_ops.c genstamp.c getutline.c \
+       $(DOMAIN) serv_extensions.c file_ops.c genstamp.c getutline.c \
        housekeeping.c html.c imap_fetch.c imap_misc.c imap_search.c \
        imap_store.c imap_tools.c internet_addressing.c ipc_c_tcp.c \
        locate_host.c logging.c md5.c messages.c migratenet.c \
@@ -121,7 +121,7 @@ citadel$(EXEEXT): citadel.o citadel_ipc.o client_chat.o client_passwords.o \
 parsedate.o: parsedate.c
 
 SERV_OBJS = server_main.o \
-       user_ops.o citserver.o sysdep.o dynloader.o \
+       user_ops.o citserver.o sysdep.o serv_extensions.o \
        tools.o $(DATABASE:.c=.o) $(DOMAIN:.c=.o) \
        control.o policy.o config.o support.o room_ops.o \
        file_ops.o msgbase.o \
index 998f9be708f190befd74097503cd9eb9f0263bc8..abbe5c16268deebd684e76a95bd1737fe029535f 100755 (executable)
@@ -5,9 +5,12 @@
 # $Id$
 #
 
+# Remove any vestiges of pre-6.05 build environments
+rm -f .libs modules *.so *.lo *.la
+
 # Goofy red hat 7.3 stuff
-if [ -s /etc/redhat-release ] ; then
-       [ `cut -f 5 -d ' ' /etc/redhat-release` = 7.3 ] && redhat73=true
+if grep 7.3 /etc/redhat-release >/dev/null 2>&1 ; then
+       redhat73=true
 else
        redhat73=false
 fi
index 86e30c91b678fb090641bc4bfbf03f86a6e68a38..783111760904df414778ea93da65c9febace1ff3 100644 (file)
@@ -40,7 +40,7 @@
 #include <arpa/inet.h>
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "sysdep_decls.h"
 #include "citserver.h"
 #include "config.h"
index ac55073bfa46276e3e1ebb96e761b1159bae7758..3985bebd0a1f1df796b6869d7c12fa05814f0a59 100644 (file)
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-#include "dynloader.h"
+#include "serv_extensions.h"
 
 /* Simple linked list structure ... used in a bunch of different places. */
 struct RoomProcList {
index 0c6d401c2f70e60166b9947d7bd9e7744dce397b..24aa21e6b974ef520a9cb3ffe17222017d62f652 100644 (file)
@@ -29,7 +29,7 @@
 #include <stdarg.h>
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #ifndef HAVE_SNPRINTF
 #include "snprintf.h"
 #endif
index 117f2bf2c8414d2ffd37a4c2d3e18ebeb2a0a331..0a305151b70bb5a15642b68d1d3d6d2714792818 100644 (file)
@@ -20,7 +20,7 @@
 #include <limits.h>
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "config.h"
 
 struct config config;
index e33d5427e244c8a6869e5ff710e009623e9bf771..7e3801679a7dc5c5f7c672f4f307b4dd24f3e8fa 100644 (file)
@@ -3,7 +3,7 @@
  *
  */
 
-#include "dynloader.h"
+#include "serv_extensions.h"
 
 void get_config(void);
 void put_config(void);
index d1baeae509c359c68dafcc630d27ebb3495f7ee5..b69dded6f2cc15d54bf27de50945b0dbb22103b4 100644 (file)
@@ -36,7 +36,7 @@
 #include "citadel.h"
 #include "server.h"
 #include "control.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "sysdep_decls.h"
 #include "support.h"
 #include "config.h"
index 7678f6aab165b2ac19818ce12022c2de66ed11eb..df38f880d9a4665f4aff1fea391bdf6b5d5f69e6 100644 (file)
@@ -46,7 +46,7 @@
 #include <pthread.h>
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "citserver.h"
 #include "database.h"
 #include "msgbase.h"
diff --git a/citadel/dynloader.c b/citadel/dynloader.c
deleted file mode 100644 (file)
index 07295ba..0000000
+++ /dev/null
@@ -1,619 +0,0 @@
-/*
- * $Id$
- *
- * Citadel Dynamic Loading Module
- * Written by Brian Costello <btx@calyx.net>
- *
- */
-
-#include "sysdep.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <string.h>
-#include <syslog.h>
-#include <limits.h>
-#include <ctype.h>
-#include "citadel.h"
-#include "server.h"
-#include "dynloader.h"
-#include "sysdep_decls.h"
-#include "msgbase.h"
-#include "tools.h"
-#include "config.h"
-
-#ifndef HAVE_SNPRINTF
-#include <stdarg.h>
-#include "snprintf.h"
-#endif
-
-struct LogFunctionHook *LogHookTable = NULL;
-struct CleanupFunctionHook *CleanupHookTable = NULL;
-struct SessionFunctionHook *SessionHookTable = NULL;
-struct UserFunctionHook *UserHookTable = NULL;
-struct XmsgFunctionHook *XmsgHookTable = NULL;
-struct MessageFunctionHook *MessageHookTable = NULL;
-struct NetprocFunctionHook *NetprocHookTable = NULL;
-struct DeleteFunctionHook *DeleteHookTable = NULL;
-struct ServiceFunctionHook *ServiceHookTable = NULL;
-
-struct ProtoFunctionHook {
-       void (*handler) (char *cmdbuf);
-       char *cmd;
-       char *desc;
-       struct ProtoFunctionHook *next;
-} *ProtoHookList = NULL;
-
-void CtdlRegisterProtoHook(void (*handler) (char *), char *cmd, char *desc)
-{
-       struct ProtoFunctionHook *p;
-
-       p = (struct ProtoFunctionHook *)
-               mallok(sizeof(struct ProtoFunctionHook));
-
-       if (p == NULL) {
-               fprintf(stderr, "can't malloc new ProtoFunctionHook\n");
-               exit(EXIT_FAILURE);
-       }
-       p->handler = handler;
-       p->cmd = cmd;
-       p->desc = desc;
-       p->next = ProtoHookList;
-       ProtoHookList = p;
-       lprintf(5, "Registered server command %s (%s)\n", cmd, desc);
-}
-
-
-void CtdlUnregisterProtoHook(void (*handler) (char *), char *cmd)
-{
-       struct ProtoFunctionHook *cur, *p;
-
-       for (cur = ProtoHookList; cur != NULL; cur = cur->next) {
-               /* This will also remove duplicates if any */
-               while (cur != NULL &&
-                               handler == cur->handler &&
-                               !strcmp(cmd, cur->cmd)) {
-                       lprintf(5, "Unregistered server command %s (%s)\n",
-                                       cmd, cur->desc);
-                       p = cur->next;
-                       if (cur == ProtoHookList) {
-                               ProtoHookList = p;
-                       }
-                       phree(cur);
-                       cur = p;
-               }
-       }
-}
-
-
-int DLoader_Exec_Cmd(char *cmdbuf)
-{
-       struct ProtoFunctionHook *p;
-
-       for (p = ProtoHookList; p; p = p->next) {
-               if (!strncasecmp(cmdbuf, p->cmd, 4)) {
-                       p->handler(&cmdbuf[5]);
-                       return 1;
-               }
-       }
-       return 0;
-}
-
-void initialize_server_extensions(void)
-{
-       serv_bio_init();
-       serv_calendar_init();
-       serv_inithat_init();
-       serv_expire_init();
-       serv_imap_init();
-       serv_inetcfg_init();
-       serv_listsub_init();
-       serv_mrtg_init();
-       serv_netfilter_init();
-       serv_network_init();
-       serv_newuser_init();
-       serv_pas2_init();
-       serv_pop3_init();
-       serv_rwho_init();
-       serv_smtp_init();
-       serv_spam_init();
-       /* serv_test_init(); */
-       serv_upgrade_init();
-       serv_vandelay_init();
-       serv_vcard_init();
-}
-
-
-
-void CtdlRegisterLogHook(void (*fcn_ptr) (char *), int loglevel)
-{
-
-       struct LogFunctionHook *newfcn;
-
-       newfcn = (struct LogFunctionHook *)
-           mallok(sizeof(struct LogFunctionHook));
-       newfcn->next = LogHookTable;
-       newfcn->h_function_pointer = fcn_ptr;
-       newfcn->loglevel = loglevel;
-       LogHookTable = newfcn;
-
-       lprintf(5, "Registered a new logging function\n");
-}
-
-
-void CtdlUnregisterLogHook(void (*fcn_ptr) (char *), int loglevel)
-{
-       struct LogFunctionHook *cur, *p;
-
-       for (cur = LogHookTable; cur != NULL; cur = cur->next) {
-               /* This will also remove duplicates if any */
-               while (cur != NULL &&
-                               fcn_ptr == cur->h_function_pointer &&
-                               loglevel == cur->loglevel) {
-                       lprintf(5, "Unregistered logging function\n");
-                       p = cur->next;
-                       if (cur == LogHookTable) {
-                               LogHookTable = p;
-                       }
-                       phree(cur);
-                       cur = p;
-               }
-       }
-}
-
-
-void CtdlRegisterCleanupHook(void (*fcn_ptr) (void))
-{
-
-       struct CleanupFunctionHook *newfcn;
-
-       newfcn = (struct CleanupFunctionHook *)
-           mallok(sizeof(struct CleanupFunctionHook));
-       newfcn->next = CleanupHookTable;
-       newfcn->h_function_pointer = fcn_ptr;
-       CleanupHookTable = newfcn;
-
-       lprintf(5, "Registered a new cleanup function\n");
-}
-
-
-void CtdlUnregisterCleanupHook(void (*fcn_ptr) (void))
-{
-       struct CleanupFunctionHook *cur, *p;
-
-       for (cur = CleanupHookTable; cur != NULL; cur = cur->next) {
-               /* This will also remove duplicates if any */
-               while (cur != NULL &&
-                               fcn_ptr == cur->h_function_pointer) {
-                       lprintf(5, "Unregistered cleanup function\n");
-                       p = cur->next;
-                       if (cur == CleanupHookTable) {
-                               CleanupHookTable = p;
-                       }
-                       phree(cur);
-                       cur = p;
-               }
-       }
-}
-
-
-void CtdlRegisterSessionHook(void (*fcn_ptr) (void), int EventType)
-{
-
-       struct SessionFunctionHook *newfcn;
-
-       newfcn = (struct SessionFunctionHook *)
-           mallok(sizeof(struct SessionFunctionHook));
-       newfcn->next = SessionHookTable;
-       newfcn->h_function_pointer = fcn_ptr;
-       newfcn->eventtype = EventType;
-       SessionHookTable = newfcn;
-
-       lprintf(5, "Registered a new session function (type %d)\n",
-               EventType);
-}
-
-
-void CtdlUnregisterSessionHook(void (*fcn_ptr) (void), int EventType)
-{
-       struct SessionFunctionHook *cur, *p;
-
-       for (cur = SessionHookTable; cur != NULL; cur = cur->next) {
-               /* This will also remove duplicates if any */
-               while (cur != NULL &&
-                               fcn_ptr == cur->h_function_pointer &&
-                               EventType == cur->eventtype) {
-                       lprintf(5, "Unregistered session function (type %d)\n",
-                                       EventType);
-                       p = cur->next;
-                       if (cur == SessionHookTable) {
-                               SessionHookTable = p;
-                       }
-                       phree(cur);
-                       cur = p;
-               }
-       }
-}
-
-
-void CtdlRegisterUserHook(void (*fcn_ptr) (char *, long), int EventType)
-{
-
-       struct UserFunctionHook *newfcn;
-
-       newfcn = (struct UserFunctionHook *)
-           mallok(sizeof(struct UserFunctionHook));
-       newfcn->next = UserHookTable;
-       newfcn->h_function_pointer = fcn_ptr;
-       newfcn->eventtype = EventType;
-       UserHookTable = newfcn;
-
-       lprintf(5, "Registered a new user function (type %d)\n",
-               EventType);
-}
-
-
-void CtdlUnregisterUserHook(void (*fcn_ptr) (char *, long), int EventType)
-{
-       struct UserFunctionHook *cur, *p;
-
-       for (cur = UserHookTable; cur != NULL; cur = cur->next) {
-               /* This will also remove duplicates if any */
-               while (cur != NULL &&
-                               fcn_ptr == cur->h_function_pointer &&
-                               EventType == cur->eventtype) {
-                       lprintf(5, "Unregistered user function (type %d)\n",
-                                       EventType);
-                       p = cur->next;
-                       if (cur == UserHookTable) {
-                               UserHookTable = p;
-                       }
-                       phree(cur);
-                       cur = p;
-               }
-       }
-}
-
-
-void CtdlRegisterMessageHook(int (*handler)(struct CtdlMessage *),
-                               int EventType)
-{
-
-       struct MessageFunctionHook *newfcn;
-
-       newfcn = (struct MessageFunctionHook *)
-           mallok(sizeof(struct MessageFunctionHook));
-       newfcn->next = MessageHookTable;
-       newfcn->h_function_pointer = handler;
-       newfcn->eventtype = EventType;
-       MessageHookTable = newfcn;
-
-       lprintf(5, "Registered a new message function (type %d)\n",
-               EventType);
-}
-
-
-void CtdlUnregisterMessageHook(int (*handler)(struct CtdlMessage *),
-               int EventType)
-{
-       struct MessageFunctionHook *cur, *p;
-
-       for (cur = MessageHookTable; cur != NULL; cur = cur->next) {
-               /* This will also remove duplicates if any */
-               while (cur != NULL &&
-                               handler == cur->h_function_pointer &&
-                               EventType == cur->eventtype) {
-                       lprintf(5, "Unregistered message function (type %d)\n",
-                                       EventType);
-                       p = cur->next;
-                       if (cur == MessageHookTable) {
-                               MessageHookTable = p;
-                       }
-                       phree(cur);
-                       cur = p;
-               }
-       }
-}
-
-
-void CtdlRegisterNetprocHook(int (*handler)(struct CtdlMessage *, char *) )
-{
-       struct NetprocFunctionHook *newfcn;
-
-       newfcn = (struct NetprocFunctionHook *)
-           mallok(sizeof(struct NetprocFunctionHook));
-       newfcn->next = NetprocHookTable;
-       newfcn->h_function_pointer = handler;
-       NetprocHookTable = newfcn;
-
-       lprintf(5, "Registered a new netproc function\n");
-}
-
-
-void CtdlUnregisterNetprocHook(int (*handler)(struct CtdlMessage *, char *) )
-{
-       struct NetprocFunctionHook *cur, *p;
-
-       for (cur = NetprocHookTable; cur != NULL; cur = cur->next) {
-               /* This will also remove duplicates if any */
-               while (cur != NULL &&
-                               handler == cur->h_function_pointer ) {
-                       lprintf(5, "Unregistered netproc function\n");
-                       p = cur->next;
-                       if (cur == NetprocHookTable) {
-                               NetprocHookTable = p;
-                       }
-                       phree(cur);
-                       cur = p;
-               }
-       }
-}
-
-
-void CtdlRegisterDeleteHook(void (*handler)(char *, long) )
-{
-       struct DeleteFunctionHook *newfcn;
-
-       newfcn = (struct DeleteFunctionHook *)
-           mallok(sizeof(struct DeleteFunctionHook));
-       newfcn->next = DeleteHookTable;
-       newfcn->h_function_pointer = handler;
-       DeleteHookTable = newfcn;
-
-       lprintf(5, "Registered a new netproc function\n");
-}
-
-
-void CtdlUnregisterDeleteHook(void (*handler)(char *, long) )
-{
-       struct DeleteFunctionHook *cur, *p;
-
-       for (cur = DeleteHookTable; cur != NULL; cur = cur->next) {
-               /* This will also remove duplicates if any */
-               while (cur != NULL &&
-                               handler == cur->h_function_pointer ) {
-                       lprintf(5, "Unregistered netproc function\n");
-                       p = cur->next;
-                       if (cur == DeleteHookTable) {
-                               DeleteHookTable = p;
-                       }
-                       phree(cur);
-                       cur = p;
-               }
-       }
-}
-
-
-void CtdlRegisterXmsgHook(int (*fcn_ptr) (char *, char *, char *), int order)
-{
-
-       struct XmsgFunctionHook *newfcn;
-
-       newfcn = (struct XmsgFunctionHook *)
-           mallok(sizeof(struct XmsgFunctionHook));
-       newfcn->next = XmsgHookTable;
-       newfcn->order = order;
-       newfcn->h_function_pointer = fcn_ptr;
-       XmsgHookTable = newfcn;
-       lprintf(5, "Registered a new x-msg function (priority %d)\n", order);
-}
-
-
-void CtdlUnregisterXmsgHook(int (*fcn_ptr) (char *, char *, char *), int order)
-{
-       struct XmsgFunctionHook *cur, *p;
-
-       for (cur = XmsgHookTable; cur != NULL; cur = cur->next) {
-               /* This will also remove duplicates if any */
-               while (cur != NULL &&
-                               fcn_ptr == cur->h_function_pointer &&
-                               order == cur->order) {
-                       lprintf(5, "Unregistered x-msg function "
-                                       "(priority %d)\n", order);
-                       p = cur->next;
-                       if (cur == XmsgHookTable) {
-                               XmsgHookTable = p;
-                       }
-                       phree(cur);
-                       cur = p;
-               }
-       }
-}
-
-
-void CtdlRegisterServiceHook(int tcp_port,
-                       char *sockpath,
-                       void (*h_greeting_function) (void),
-                       void (*h_command_function) (void) )
-{
-       struct ServiceFunctionHook *newfcn;
-       char message[SIZ];
-
-       newfcn = (struct ServiceFunctionHook *)
-           mallok(sizeof(struct ServiceFunctionHook));
-       newfcn->next = ServiceHookTable;
-       newfcn->tcp_port = tcp_port;
-       newfcn->sockpath = sockpath;
-       newfcn->h_greeting_function = h_greeting_function;
-       newfcn->h_command_function = h_command_function;
-
-       if (sockpath != NULL) {
-               newfcn->msock = ig_uds_server(sockpath, config.c_maxsessions);
-               snprintf(message, sizeof message, "Unix domain socket '%s': ", sockpath);
-       }
-       else if (tcp_port <= 0) {       /* port -1 to disable */
-               lprintf(7, "Service has been manually disabled, skipping\n");
-               phree(newfcn);
-               return;
-       }
-       else {
-               newfcn->msock = ig_tcp_server(tcp_port, config.c_maxsessions);
-               snprintf(message, sizeof message, "TCP port %d: ", tcp_port);
-       }
-
-       if (newfcn->msock > 0) {
-               ServiceHookTable = newfcn;
-               strcat(message, "registered.");
-               lprintf(5, "%s\n", message);
-       }
-       else {
-               strcat(message, "FAILED.");
-               lprintf(2, "%s\n", message);
-               phree(newfcn);
-       }
-}
-
-
-void CtdlUnregisterServiceHook(int tcp_port, char *sockpath,
-                       void (*h_greeting_function) (void),
-                       void (*h_command_function) (void) )
-{
-       struct ServiceFunctionHook *cur, *p;
-
-       for (cur = ServiceHookTable; cur != NULL; cur = cur->next) {
-               /* This will also remove duplicates if any */
-               while (cur != NULL &&
-                               !(sockpath && cur->sockpath &&
-                                       strcmp(sockpath, cur->sockpath)) &&
-                               h_greeting_function == cur->h_greeting_function &&
-                               h_command_function == cur->h_command_function &&
-                               tcp_port == cur->tcp_port) {
-                       close(cur->msock);
-                       if (sockpath) {
-                               lprintf(5, "Closed UNIX domain socket %s\n",
-                                               sockpath);
-                       } else if (tcp_port) {
-                               lprintf(5, "Closed TCP port %d\n", tcp_port);
-                       } else {
-                               lprintf(5, "Unregistered unknown service\n");
-                       }
-                       p = cur->next;
-                       if (cur == ServiceHookTable) {
-                               ServiceHookTable = p;
-                       }
-                       phree(cur);
-                       cur = p;
-               }
-       }
-}
-
-
-void PerformSessionHooks(int EventType)
-{
-       struct SessionFunctionHook *fcn;
-
-       for (fcn = SessionHookTable; fcn != NULL; fcn = fcn->next) {
-               if (fcn->eventtype == EventType) {
-                       (*fcn->h_function_pointer) ();
-               }
-       }
-}
-
-void PerformLogHooks(int loglevel, char *logmsg)
-{
-       struct LogFunctionHook *fcn;
-
-       for (fcn = LogHookTable; fcn != NULL; fcn = fcn->next) {
-               if (fcn->loglevel >= loglevel) {
-                       (*fcn->h_function_pointer) (logmsg);
-               }
-       }
-}
-
-void PerformUserHooks(char *username, long usernum, int EventType)
-{
-       struct UserFunctionHook *fcn;
-
-       for (fcn = UserHookTable; fcn != NULL; fcn = fcn->next) {
-               if (fcn->eventtype == EventType) {
-                       (*fcn->h_function_pointer) (username, usernum);
-               }
-       }
-}
-
-int PerformMessageHooks(struct CtdlMessage *msg, int EventType)
-{
-       struct MessageFunctionHook *fcn;
-       int total_retval = 0;
-
-       /* Other code may elect to protect this message from server-side
-        * handlers; if this is the case, don't do anything.
-       lprintf(9, "** Event type is %d, flags are %d\n",
-               EventType, msg->cm_flags);
-        */
-       if (msg->cm_flags & CM_SKIP_HOOKS) {
-               lprintf(9, "Skipping hooks\n");
-               return(0);
-       }
-
-       /* Otherwise, run all the hooks appropriate to this event type.
-        */
-       for (fcn = MessageHookTable; fcn != NULL; fcn = fcn->next) {
-               if (fcn->eventtype == EventType) {
-                       total_retval = total_retval +
-                               (*fcn->h_function_pointer) (msg);
-               }
-       }
-
-       /* Return the sum of the return codes from the hook functions.  If
-        * this is an EVT_BEFORESAVE event, a nonzero return code will cause
-        * the save operation to abort.
-        */
-       return total_retval;
-}
-
-
-
-int PerformNetprocHooks(struct CtdlMessage *msg, char *target_room)
-{
-       struct NetprocFunctionHook *fcn;
-       int total_retval = 0;
-
-       for (fcn = NetprocHookTable; fcn != NULL; fcn = fcn->next) {
-               total_retval = total_retval +
-                       (*fcn->h_function_pointer) (msg, target_room);
-       }
-
-       /* Return the sum of the return codes from the hook functions.
-        * A nonzero return code will cause the message to *not* be imported.
-        */
-       return total_retval;
-}
-
-
-void PerformDeleteHooks(char *room, long msgnum)
-{
-       struct DeleteFunctionHook *fcn;
-
-       for (fcn = DeleteHookTable; fcn != NULL; fcn = fcn->next) {
-               (*fcn->h_function_pointer) (room, msgnum);
-       }
-}
-
-
-
-int PerformXmsgHooks(char *sender, char *recp, char *msg)
-{
-       struct XmsgFunctionHook *fcn;
-       int total_sent = 0;
-       int p;
-
-       for (p=0; p<MAX_XMSG_PRI; ++p) {
-               for (fcn = XmsgHookTable; fcn != NULL; fcn = fcn->next) {
-                       if (fcn->order == p) {
-                               total_sent +=
-                                       (*fcn->h_function_pointer)
-                                               (sender, recp, msg);
-                       }
-               }
-               /* Break out of the loop if a higher-priority function
-                * successfully delivered the message.  This prevents duplicate
-                * deliveries to local users simultaneously signed onto
-                * remote services.
-                */
-               if (total_sent) break;
-       }
-       return total_sent;
-}
diff --git a/citadel/dynloader.h b/citadel/dynloader.h
deleted file mode 100644 (file)
index 69b26bf..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id$ */
-
-#ifndef DYNLOADER_H
-#define DYNLOADER_H
-
-#include "server.h"
-
-void initialize_server_extensions(void);
-int DLoader_Exec_Cmd(char *cmdbuf);
-char *Dynamic_Module_Init(void);
-
-void CtdlRegisterLogHook(void (*fcn_ptr)(char *), int loglevel);
-void CtdlUnregisterLogHook(void (*fcn_ptr)(char *), int loglevel);
-void PerformLogHooks(int loglevel, char *logmsg);
-
-void CtdlRegisterSessionHook(void (*fcn_ptr)(void), int EventType);
-void CtdlUnregisterSessionHook(void (*fcn_ptr)(void), int EventType);
-void PerformSessionHooks(int EventType);
-
-void CtdlRegisterUserHook(void (*fcn_ptr)(char*, long), int EventType);
-void CtdlUnregisterUserHook(void (*fcn_ptr)(char*, long), int EventType);
-void PerformUserHooks(char *username, long usernum, int EventType);
-
-void CtdlRegisterXmsgHook(int (*fcn_ptr)(char *, char *, char *), int order);
-void CtdlUnregisterXmsgHook(int (*fcn_ptr)(char *, char *, char *), int order);
-int PerformXmsgHooks(char *, char *, char *);
-
-
-void CtdlRegisterMessageHook(int (*handler)(struct CtdlMessage *),
-                                                       int EventType);
-void CtdlUnregisterMessageHook(int (*handler)(struct CtdlMessage *),
-                                                       int EventType);
-int PerformMessageHooks(struct CtdlMessage *, int EventType);
-
-
-void CtdlRegisterNetprocHook(int (*handler)(struct CtdlMessage *, char *) );
-void CtdlUnregisterNetprocHook(int (*handler)(struct CtdlMessage *, char *) );
-int PerformNetprocHooks(struct CtdlMessage *, char *);
-
-void CtdlRegisterDeleteHook(void (*handler)(char *, long) );
-void CtdlUnregisterDeleteHook(void (*handler)(char *, long) );
-void PerformDeleteHooks(char *, long);
-
-
-void CtdlRegisterCleanupHook(void (*fcn_ptr)(void));
-void CtdlUnregisterCleanupHook(void (*fcn_ptr)(void));
-void CtdlRegisterProtoHook(void (*handler)(char *), char *cmd, char *desc);
-void CtdlUnregisterProtoHook(void (*handler)(char *), char *cmd);
-void CtdlRegisterServiceHook(int tcp_port,
-                       char *sockpath,
-                        void (*h_greeting_function) (void),
-                        void (*h_command_function) (void) ) ;
-void CtdlUnregisterServiceHook(int tcp_port,
-                       char *sockpath,
-                        void (*h_greeting_function) (void),
-                        void (*h_command_function) (void) ) ;
-
-#endif /* DYNLOADER_H */
index b016cba47131fecb7c79fa4c098ec702237ea89b..c9ab9b1566eec6060f2976a88a0ff86eecea19af 100644 (file)
@@ -33,7 +33,7 @@
 #include <limits.h>
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "config.h"
 #include "file_ops.h"
 #include "sysdep_decls.h"
index 98d4c2c16db58e6b4af2ba638f8cfb6c3cac83b4..c0eb5d2cccdda472967732f5b62dab1a1b2ffc6b 100644 (file)
@@ -37,7 +37,7 @@
 #include "tools.h"
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "citserver.h"
 #include "config.h"
 #include "housekeeping.h"
index d717393b4de4cfe77739d2e6c9e116ccc22a3006..af5c6e66b2560c9194a6baf0bda1f95873d2929f 100644 (file)
@@ -35,7 +35,7 @@
 #include <syslog.h>
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "control.h"
 #include "sysdep_decls.h"
 #include "support.h"
index c1751fa0586a4942fc29e5596e38d1069e27e017..a17e47da347e1fb65a89669456a6eea06db603be 100644 (file)
@@ -38,7 +38,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index 1c5cc0bce9faf285fb1528508d93f677ba136082..ab03090b1a068f7d119ef56db28412c87cb4fffd 100644 (file)
@@ -36,7 +36,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index 4158c0b78f80650b14e0d2b656d393334e6c77e5..9fd6b34b9d0d469de99107c65c588bee9136a171 100644 (file)
@@ -38,7 +38,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index ec2de6f4f600f4836002f40c9cd9ad9ef3f2de38..e3ce69b5bd6ddc5758bc8e910da9ee7c130f7057 100644 (file)
@@ -37,7 +37,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index 6533f2c2dc6f98c4b26c59742aa16b41ef4332ab..ca45a4b09d144d0738a099892304ba0a6a5c6ece 100644 (file)
@@ -36,7 +36,7 @@
 #include <limits.h>
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "sysdep_decls.h"
 #include "citserver.h"
 #include "support.h"
index 7e30b46f2aea6732dc06b88b44812ef6a38ce889..3f50fe60a714d1882116e25e3b1c91a97359cfaf 100644 (file)
@@ -22,7 +22,7 @@
 #include <string.h>
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "locate_host.h"
 #include "sysdep_decls.h"
 #include "config.h"
index afc719803afafef48a29b19e66d83e91a275ef46..e4d1e13cdc0e2d48e913766c132d566b75bb029a 100644 (file)
@@ -24,7 +24,7 @@
 
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "sysdep_decls.h"
 #include "tools.h"
 
index e11fb12b1ce7f6a526cd8c8bfa2bc4c9000241aa..622f1f1a277a4bbee8aa83df028234d9ab968685 100644 (file)
@@ -36,7 +36,7 @@
 #include <sys/stat.h>
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "database.h"
 #include "msgbase.h"
 #include "support.h"
index d3016040015e9801eb4765a8e153752d5ceda0b6..6ce8ed5701151543827c5075c3d6a5f56b31f228 100644 (file)
@@ -30,7 +30,7 @@
 #include "citadel.h"
 #include "server.h"
 #include "database.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "config.h"
 #include "room_ops.h"
 #include "sysdep_decls.h"
index fdba64de0fb1ab0f5d461064091b89b6dc067201..a2ef5da7bea1c9b81d0bd6ef6191706e8196c9eb 100644 (file)
@@ -31,7 +31,7 @@
 #include <errno.h>
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "database.h"
 #include "config.h"
 #include "room_ops.h"
index ca0d606e6112fad741ac1ac9b756148fee3f5884..9960af66737475023a219b11a0095f69dcf2fbad 100644 (file)
@@ -33,7 +33,7 @@
 #include "tools.h"
 #include "citadel_ipc.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "config.h"
 
 #define LOCKFILE "/tmp/LCK.sendcommand"
index 66b79c9aa44e0281191e71475b79fc880c428e5d..62d313f4270b2e4ea7b630296cc9e0ae8f9677ef 100644 (file)
@@ -37,7 +37,7 @@
 #include "support.h"
 #include "config.h"
 #include "control.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index b274481f8ac305d88acabece570f518e4fdfad5e..4d77cf32724390f18f257096278b45868815366c 100644 (file)
@@ -24,7 +24,7 @@
 #include "sysdep_decls.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "user_ops.h"
 #include "room_ops.h"
 #include "tools.h"
index fcb724f1cdc11ebd500f5565153cce70b9da7504..9d005dfe94dc681e70cceb4a2a76f8c7e7f25106 100644 (file)
@@ -31,7 +31,7 @@
 #include <limits.h>
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include <syslog.h>
 #include "serv_chat.h"
 #include "sysdep_decls.h"
index 26a540d2faeea952aa363b952d9c3fceb3a19962..7a87f064f074b89d64d403104f3bfa584082f398 100644 (file)
@@ -34,7 +34,7 @@
 #include "server.h"
 #include "serv_crypto.h"
 #include "sysdep_decls.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 
 
 #ifdef HAVE_OPENSSL
index c3a22eb47947f636a34fb4478987479675b11583..83a39308a7351268acfc13f08e283aa6aece282c 100644 (file)
@@ -56,7 +56,7 @@
 #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"
diff --git a/citadel/serv_extensions.c b/citadel/serv_extensions.c
new file mode 100644 (file)
index 0000000..286fe5b
--- /dev/null
@@ -0,0 +1,619 @@
+/*
+ * $Id$
+ *
+ * Citadel Dynamic Loading Module
+ * Written by Brian Costello <btx@calyx.net>
+ *
+ */
+
+#include "sysdep.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <string.h>
+#include <syslog.h>
+#include <limits.h>
+#include <ctype.h>
+#include "citadel.h"
+#include "server.h"
+#include "serv_extensions.h"
+#include "sysdep_decls.h"
+#include "msgbase.h"
+#include "tools.h"
+#include "config.h"
+
+#ifndef HAVE_SNPRINTF
+#include <stdarg.h>
+#include "snprintf.h"
+#endif
+
+struct LogFunctionHook *LogHookTable = NULL;
+struct CleanupFunctionHook *CleanupHookTable = NULL;
+struct SessionFunctionHook *SessionHookTable = NULL;
+struct UserFunctionHook *UserHookTable = NULL;
+struct XmsgFunctionHook *XmsgHookTable = NULL;
+struct MessageFunctionHook *MessageHookTable = NULL;
+struct NetprocFunctionHook *NetprocHookTable = NULL;
+struct DeleteFunctionHook *DeleteHookTable = NULL;
+struct ServiceFunctionHook *ServiceHookTable = NULL;
+
+struct ProtoFunctionHook {
+       void (*handler) (char *cmdbuf);
+       char *cmd;
+       char *desc;
+       struct ProtoFunctionHook *next;
+} *ProtoHookList = NULL;
+
+void CtdlRegisterProtoHook(void (*handler) (char *), char *cmd, char *desc)
+{
+       struct ProtoFunctionHook *p;
+
+       p = (struct ProtoFunctionHook *)
+               mallok(sizeof(struct ProtoFunctionHook));
+
+       if (p == NULL) {
+               fprintf(stderr, "can't malloc new ProtoFunctionHook\n");
+               exit(EXIT_FAILURE);
+       }
+       p->handler = handler;
+       p->cmd = cmd;
+       p->desc = desc;
+       p->next = ProtoHookList;
+       ProtoHookList = p;
+       lprintf(5, "Registered server command %s (%s)\n", cmd, desc);
+}
+
+
+void CtdlUnregisterProtoHook(void (*handler) (char *), char *cmd)
+{
+       struct ProtoFunctionHook *cur, *p;
+
+       for (cur = ProtoHookList; cur != NULL; cur = cur->next) {
+               /* This will also remove duplicates if any */
+               while (cur != NULL &&
+                               handler == cur->handler &&
+                               !strcmp(cmd, cur->cmd)) {
+                       lprintf(5, "Unregistered server command %s (%s)\n",
+                                       cmd, cur->desc);
+                       p = cur->next;
+                       if (cur == ProtoHookList) {
+                               ProtoHookList = p;
+                       }
+                       phree(cur);
+                       cur = p;
+               }
+       }
+}
+
+
+int DLoader_Exec_Cmd(char *cmdbuf)
+{
+       struct ProtoFunctionHook *p;
+
+       for (p = ProtoHookList; p; p = p->next) {
+               if (!strncasecmp(cmdbuf, p->cmd, 4)) {
+                       p->handler(&cmdbuf[5]);
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+void initialize_server_extensions(void)
+{
+       serv_bio_init();
+       serv_calendar_init();
+       serv_inithat_init();
+       serv_expire_init();
+       serv_imap_init();
+       serv_inetcfg_init();
+       serv_listsub_init();
+       serv_mrtg_init();
+       serv_netfilter_init();
+       serv_network_init();
+       serv_newuser_init();
+       serv_pas2_init();
+       serv_pop3_init();
+       serv_rwho_init();
+       serv_smtp_init();
+       serv_spam_init();
+       /* serv_test_init(); */
+       serv_upgrade_init();
+       serv_vandelay_init();
+       serv_vcard_init();
+}
+
+
+
+void CtdlRegisterLogHook(void (*fcn_ptr) (char *), int loglevel)
+{
+
+       struct LogFunctionHook *newfcn;
+
+       newfcn = (struct LogFunctionHook *)
+           mallok(sizeof(struct LogFunctionHook));
+       newfcn->next = LogHookTable;
+       newfcn->h_function_pointer = fcn_ptr;
+       newfcn->loglevel = loglevel;
+       LogHookTable = newfcn;
+
+       lprintf(5, "Registered a new logging function\n");
+}
+
+
+void CtdlUnregisterLogHook(void (*fcn_ptr) (char *), int loglevel)
+{
+       struct LogFunctionHook *cur, *p;
+
+       for (cur = LogHookTable; cur != NULL; cur = cur->next) {
+               /* This will also remove duplicates if any */
+               while (cur != NULL &&
+                               fcn_ptr == cur->h_function_pointer &&
+                               loglevel == cur->loglevel) {
+                       lprintf(5, "Unregistered logging function\n");
+                       p = cur->next;
+                       if (cur == LogHookTable) {
+                               LogHookTable = p;
+                       }
+                       phree(cur);
+                       cur = p;
+               }
+       }
+}
+
+
+void CtdlRegisterCleanupHook(void (*fcn_ptr) (void))
+{
+
+       struct CleanupFunctionHook *newfcn;
+
+       newfcn = (struct CleanupFunctionHook *)
+           mallok(sizeof(struct CleanupFunctionHook));
+       newfcn->next = CleanupHookTable;
+       newfcn->h_function_pointer = fcn_ptr;
+       CleanupHookTable = newfcn;
+
+       lprintf(5, "Registered a new cleanup function\n");
+}
+
+
+void CtdlUnregisterCleanupHook(void (*fcn_ptr) (void))
+{
+       struct CleanupFunctionHook *cur, *p;
+
+       for (cur = CleanupHookTable; cur != NULL; cur = cur->next) {
+               /* This will also remove duplicates if any */
+               while (cur != NULL &&
+                               fcn_ptr == cur->h_function_pointer) {
+                       lprintf(5, "Unregistered cleanup function\n");
+                       p = cur->next;
+                       if (cur == CleanupHookTable) {
+                               CleanupHookTable = p;
+                       }
+                       phree(cur);
+                       cur = p;
+               }
+       }
+}
+
+
+void CtdlRegisterSessionHook(void (*fcn_ptr) (void), int EventType)
+{
+
+       struct SessionFunctionHook *newfcn;
+
+       newfcn = (struct SessionFunctionHook *)
+           mallok(sizeof(struct SessionFunctionHook));
+       newfcn->next = SessionHookTable;
+       newfcn->h_function_pointer = fcn_ptr;
+       newfcn->eventtype = EventType;
+       SessionHookTable = newfcn;
+
+       lprintf(5, "Registered a new session function (type %d)\n",
+               EventType);
+}
+
+
+void CtdlUnregisterSessionHook(void (*fcn_ptr) (void), int EventType)
+{
+       struct SessionFunctionHook *cur, *p;
+
+       for (cur = SessionHookTable; cur != NULL; cur = cur->next) {
+               /* This will also remove duplicates if any */
+               while (cur != NULL &&
+                               fcn_ptr == cur->h_function_pointer &&
+                               EventType == cur->eventtype) {
+                       lprintf(5, "Unregistered session function (type %d)\n",
+                                       EventType);
+                       p = cur->next;
+                       if (cur == SessionHookTable) {
+                               SessionHookTable = p;
+                       }
+                       phree(cur);
+                       cur = p;
+               }
+       }
+}
+
+
+void CtdlRegisterUserHook(void (*fcn_ptr) (char *, long), int EventType)
+{
+
+       struct UserFunctionHook *newfcn;
+
+       newfcn = (struct UserFunctionHook *)
+           mallok(sizeof(struct UserFunctionHook));
+       newfcn->next = UserHookTable;
+       newfcn->h_function_pointer = fcn_ptr;
+       newfcn->eventtype = EventType;
+       UserHookTable = newfcn;
+
+       lprintf(5, "Registered a new user function (type %d)\n",
+               EventType);
+}
+
+
+void CtdlUnregisterUserHook(void (*fcn_ptr) (char *, long), int EventType)
+{
+       struct UserFunctionHook *cur, *p;
+
+       for (cur = UserHookTable; cur != NULL; cur = cur->next) {
+               /* This will also remove duplicates if any */
+               while (cur != NULL &&
+                               fcn_ptr == cur->h_function_pointer &&
+                               EventType == cur->eventtype) {
+                       lprintf(5, "Unregistered user function (type %d)\n",
+                                       EventType);
+                       p = cur->next;
+                       if (cur == UserHookTable) {
+                               UserHookTable = p;
+                       }
+                       phree(cur);
+                       cur = p;
+               }
+       }
+}
+
+
+void CtdlRegisterMessageHook(int (*handler)(struct CtdlMessage *),
+                               int EventType)
+{
+
+       struct MessageFunctionHook *newfcn;
+
+       newfcn = (struct MessageFunctionHook *)
+           mallok(sizeof(struct MessageFunctionHook));
+       newfcn->next = MessageHookTable;
+       newfcn->h_function_pointer = handler;
+       newfcn->eventtype = EventType;
+       MessageHookTable = newfcn;
+
+       lprintf(5, "Registered a new message function (type %d)\n",
+               EventType);
+}
+
+
+void CtdlUnregisterMessageHook(int (*handler)(struct CtdlMessage *),
+               int EventType)
+{
+       struct MessageFunctionHook *cur, *p;
+
+       for (cur = MessageHookTable; cur != NULL; cur = cur->next) {
+               /* This will also remove duplicates if any */
+               while (cur != NULL &&
+                               handler == cur->h_function_pointer &&
+                               EventType == cur->eventtype) {
+                       lprintf(5, "Unregistered message function (type %d)\n",
+                                       EventType);
+                       p = cur->next;
+                       if (cur == MessageHookTable) {
+                               MessageHookTable = p;
+                       }
+                       phree(cur);
+                       cur = p;
+               }
+       }
+}
+
+
+void CtdlRegisterNetprocHook(int (*handler)(struct CtdlMessage *, char *) )
+{
+       struct NetprocFunctionHook *newfcn;
+
+       newfcn = (struct NetprocFunctionHook *)
+           mallok(sizeof(struct NetprocFunctionHook));
+       newfcn->next = NetprocHookTable;
+       newfcn->h_function_pointer = handler;
+       NetprocHookTable = newfcn;
+
+       lprintf(5, "Registered a new netproc function\n");
+}
+
+
+void CtdlUnregisterNetprocHook(int (*handler)(struct CtdlMessage *, char *) )
+{
+       struct NetprocFunctionHook *cur, *p;
+
+       for (cur = NetprocHookTable; cur != NULL; cur = cur->next) {
+               /* This will also remove duplicates if any */
+               while (cur != NULL &&
+                               handler == cur->h_function_pointer ) {
+                       lprintf(5, "Unregistered netproc function\n");
+                       p = cur->next;
+                       if (cur == NetprocHookTable) {
+                               NetprocHookTable = p;
+                       }
+                       phree(cur);
+                       cur = p;
+               }
+       }
+}
+
+
+void CtdlRegisterDeleteHook(void (*handler)(char *, long) )
+{
+       struct DeleteFunctionHook *newfcn;
+
+       newfcn = (struct DeleteFunctionHook *)
+           mallok(sizeof(struct DeleteFunctionHook));
+       newfcn->next = DeleteHookTable;
+       newfcn->h_function_pointer = handler;
+       DeleteHookTable = newfcn;
+
+       lprintf(5, "Registered a new netproc function\n");
+}
+
+
+void CtdlUnregisterDeleteHook(void (*handler)(char *, long) )
+{
+       struct DeleteFunctionHook *cur, *p;
+
+       for (cur = DeleteHookTable; cur != NULL; cur = cur->next) {
+               /* This will also remove duplicates if any */
+               while (cur != NULL &&
+                               handler == cur->h_function_pointer ) {
+                       lprintf(5, "Unregistered netproc function\n");
+                       p = cur->next;
+                       if (cur == DeleteHookTable) {
+                               DeleteHookTable = p;
+                       }
+                       phree(cur);
+                       cur = p;
+               }
+       }
+}
+
+
+void CtdlRegisterXmsgHook(int (*fcn_ptr) (char *, char *, char *), int order)
+{
+
+       struct XmsgFunctionHook *newfcn;
+
+       newfcn = (struct XmsgFunctionHook *)
+           mallok(sizeof(struct XmsgFunctionHook));
+       newfcn->next = XmsgHookTable;
+       newfcn->order = order;
+       newfcn->h_function_pointer = fcn_ptr;
+       XmsgHookTable = newfcn;
+       lprintf(5, "Registered a new x-msg function (priority %d)\n", order);
+}
+
+
+void CtdlUnregisterXmsgHook(int (*fcn_ptr) (char *, char *, char *), int order)
+{
+       struct XmsgFunctionHook *cur, *p;
+
+       for (cur = XmsgHookTable; cur != NULL; cur = cur->next) {
+               /* This will also remove duplicates if any */
+               while (cur != NULL &&
+                               fcn_ptr == cur->h_function_pointer &&
+                               order == cur->order) {
+                       lprintf(5, "Unregistered x-msg function "
+                                       "(priority %d)\n", order);
+                       p = cur->next;
+                       if (cur == XmsgHookTable) {
+                               XmsgHookTable = p;
+                       }
+                       phree(cur);
+                       cur = p;
+               }
+       }
+}
+
+
+void CtdlRegisterServiceHook(int tcp_port,
+                       char *sockpath,
+                       void (*h_greeting_function) (void),
+                       void (*h_command_function) (void) )
+{
+       struct ServiceFunctionHook *newfcn;
+       char message[SIZ];
+
+       newfcn = (struct ServiceFunctionHook *)
+           mallok(sizeof(struct ServiceFunctionHook));
+       newfcn->next = ServiceHookTable;
+       newfcn->tcp_port = tcp_port;
+       newfcn->sockpath = sockpath;
+       newfcn->h_greeting_function = h_greeting_function;
+       newfcn->h_command_function = h_command_function;
+
+       if (sockpath != NULL) {
+               newfcn->msock = ig_uds_server(sockpath, config.c_maxsessions);
+               snprintf(message, sizeof message, "Unix domain socket '%s': ", sockpath);
+       }
+       else if (tcp_port <= 0) {       /* port -1 to disable */
+               lprintf(7, "Service has been manually disabled, skipping\n");
+               phree(newfcn);
+               return;
+       }
+       else {
+               newfcn->msock = ig_tcp_server(tcp_port, config.c_maxsessions);
+               snprintf(message, sizeof message, "TCP port %d: ", tcp_port);
+       }
+
+       if (newfcn->msock > 0) {
+               ServiceHookTable = newfcn;
+               strcat(message, "registered.");
+               lprintf(5, "%s\n", message);
+       }
+       else {
+               strcat(message, "FAILED.");
+               lprintf(2, "%s\n", message);
+               phree(newfcn);
+       }
+}
+
+
+void CtdlUnregisterServiceHook(int tcp_port, char *sockpath,
+                       void (*h_greeting_function) (void),
+                       void (*h_command_function) (void) )
+{
+       struct ServiceFunctionHook *cur, *p;
+
+       for (cur = ServiceHookTable; cur != NULL; cur = cur->next) {
+               /* This will also remove duplicates if any */
+               while (cur != NULL &&
+                               !(sockpath && cur->sockpath &&
+                                       strcmp(sockpath, cur->sockpath)) &&
+                               h_greeting_function == cur->h_greeting_function &&
+                               h_command_function == cur->h_command_function &&
+                               tcp_port == cur->tcp_port) {
+                       close(cur->msock);
+                       if (sockpath) {
+                               lprintf(5, "Closed UNIX domain socket %s\n",
+                                               sockpath);
+                       } else if (tcp_port) {
+                               lprintf(5, "Closed TCP port %d\n", tcp_port);
+                       } else {
+                               lprintf(5, "Unregistered unknown service\n");
+                       }
+                       p = cur->next;
+                       if (cur == ServiceHookTable) {
+                               ServiceHookTable = p;
+                       }
+                       phree(cur);
+                       cur = p;
+               }
+       }
+}
+
+
+void PerformSessionHooks(int EventType)
+{
+       struct SessionFunctionHook *fcn;
+
+       for (fcn = SessionHookTable; fcn != NULL; fcn = fcn->next) {
+               if (fcn->eventtype == EventType) {
+                       (*fcn->h_function_pointer) ();
+               }
+       }
+}
+
+void PerformLogHooks(int loglevel, char *logmsg)
+{
+       struct LogFunctionHook *fcn;
+
+       for (fcn = LogHookTable; fcn != NULL; fcn = fcn->next) {
+               if (fcn->loglevel >= loglevel) {
+                       (*fcn->h_function_pointer) (logmsg);
+               }
+       }
+}
+
+void PerformUserHooks(char *username, long usernum, int EventType)
+{
+       struct UserFunctionHook *fcn;
+
+       for (fcn = UserHookTable; fcn != NULL; fcn = fcn->next) {
+               if (fcn->eventtype == EventType) {
+                       (*fcn->h_function_pointer) (username, usernum);
+               }
+       }
+}
+
+int PerformMessageHooks(struct CtdlMessage *msg, int EventType)
+{
+       struct MessageFunctionHook *fcn;
+       int total_retval = 0;
+
+       /* Other code may elect to protect this message from server-side
+        * handlers; if this is the case, don't do anything.
+       lprintf(9, "** Event type is %d, flags are %d\n",
+               EventType, msg->cm_flags);
+        */
+       if (msg->cm_flags & CM_SKIP_HOOKS) {
+               lprintf(9, "Skipping hooks\n");
+               return(0);
+       }
+
+       /* Otherwise, run all the hooks appropriate to this event type.
+        */
+       for (fcn = MessageHookTable; fcn != NULL; fcn = fcn->next) {
+               if (fcn->eventtype == EventType) {
+                       total_retval = total_retval +
+                               (*fcn->h_function_pointer) (msg);
+               }
+       }
+
+       /* Return the sum of the return codes from the hook functions.  If
+        * this is an EVT_BEFORESAVE event, a nonzero return code will cause
+        * the save operation to abort.
+        */
+       return total_retval;
+}
+
+
+
+int PerformNetprocHooks(struct CtdlMessage *msg, char *target_room)
+{
+       struct NetprocFunctionHook *fcn;
+       int total_retval = 0;
+
+       for (fcn = NetprocHookTable; fcn != NULL; fcn = fcn->next) {
+               total_retval = total_retval +
+                       (*fcn->h_function_pointer) (msg, target_room);
+       }
+
+       /* Return the sum of the return codes from the hook functions.
+        * A nonzero return code will cause the message to *not* be imported.
+        */
+       return total_retval;
+}
+
+
+void PerformDeleteHooks(char *room, long msgnum)
+{
+       struct DeleteFunctionHook *fcn;
+
+       for (fcn = DeleteHookTable; fcn != NULL; fcn = fcn->next) {
+               (*fcn->h_function_pointer) (room, msgnum);
+       }
+}
+
+
+
+int PerformXmsgHooks(char *sender, char *recp, char *msg)
+{
+       struct XmsgFunctionHook *fcn;
+       int total_sent = 0;
+       int p;
+
+       for (p=0; p<MAX_XMSG_PRI; ++p) {
+               for (fcn = XmsgHookTable; fcn != NULL; fcn = fcn->next) {
+                       if (fcn->order == p) {
+                               total_sent +=
+                                       (*fcn->h_function_pointer)
+                                               (sender, recp, msg);
+                       }
+               }
+               /* Break out of the loop if a higher-priority function
+                * successfully delivered the message.  This prevents duplicate
+                * deliveries to local users simultaneously signed onto
+                * remote services.
+                */
+               if (total_sent) break;
+       }
+       return total_sent;
+}
diff --git a/citadel/serv_extensions.h b/citadel/serv_extensions.h
new file mode 100644 (file)
index 0000000..1f55607
--- /dev/null
@@ -0,0 +1,86 @@
+/* $Id$ */
+
+#ifndef SERV_EXTENSIONS_H
+#define SERV_EXTENSIONS_H
+
+#include "server.h"
+
+/*
+ * This is where we declare all of the server extensions we have.
+ * We'll probably start moving these to a more sane location in the near
+ * future.  For now, this just shuts up the compiler.
+ */
+char *serv_bio_init(void);
+char *serv_calendar_init(void);
+char *serv_inithat_init(void);
+char *serv_expire_init(void);
+char *serv_imap_init(void);
+char *serv_inetcfg_init(void);
+char *serv_listsub_init(void);
+char *serv_mrtg_init(void);
+char *serv_netfilter_init(void);
+char *serv_network_init(void);
+char *serv_newuser_init(void);
+char *serv_pas2_init(void);
+char *serv_pop3_init(void);
+char *serv_rwho_init(void);
+char *serv_smtp_init(void);
+char *serv_spam_init(void);
+char *serv_test_init(void);
+char *serv_upgrade_init(void);
+char *serv_vandelay_init(void);
+char *serv_vcard_init(void);
+/*
+ */
+
+void initialize_server_extensions(void);
+int DLoader_Exec_Cmd(char *cmdbuf);
+char *Dynamic_Module_Init(void);
+
+void CtdlRegisterLogHook(void (*fcn_ptr)(char *), int loglevel);
+void CtdlUnregisterLogHook(void (*fcn_ptr)(char *), int loglevel);
+void PerformLogHooks(int loglevel, char *logmsg);
+
+void CtdlRegisterSessionHook(void (*fcn_ptr)(void), int EventType);
+void CtdlUnregisterSessionHook(void (*fcn_ptr)(void), int EventType);
+void PerformSessionHooks(int EventType);
+
+void CtdlRegisterUserHook(void (*fcn_ptr)(char*, long), int EventType);
+void CtdlUnregisterUserHook(void (*fcn_ptr)(char*, long), int EventType);
+void PerformUserHooks(char *username, long usernum, int EventType);
+
+void CtdlRegisterXmsgHook(int (*fcn_ptr)(char *, char *, char *), int order);
+void CtdlUnregisterXmsgHook(int (*fcn_ptr)(char *, char *, char *), int order);
+int PerformXmsgHooks(char *, char *, char *);
+
+
+void CtdlRegisterMessageHook(int (*handler)(struct CtdlMessage *),
+                                                       int EventType);
+void CtdlUnregisterMessageHook(int (*handler)(struct CtdlMessage *),
+                                                       int EventType);
+int PerformMessageHooks(struct CtdlMessage *, int EventType);
+
+
+void CtdlRegisterNetprocHook(int (*handler)(struct CtdlMessage *, char *) );
+void CtdlUnregisterNetprocHook(int (*handler)(struct CtdlMessage *, char *) );
+int PerformNetprocHooks(struct CtdlMessage *, char *);
+
+void CtdlRegisterDeleteHook(void (*handler)(char *, long) );
+void CtdlUnregisterDeleteHook(void (*handler)(char *, long) );
+void PerformDeleteHooks(char *, long);
+
+
+void CtdlRegisterCleanupHook(void (*fcn_ptr)(void));
+void CtdlUnregisterCleanupHook(void (*fcn_ptr)(void));
+void CtdlRegisterProtoHook(void (*handler)(char *), char *cmd, char *desc);
+void CtdlUnregisterProtoHook(void (*handler)(char *), char *cmd);
+void CtdlRegisterServiceHook(int tcp_port,
+                       char *sockpath,
+                        void (*h_greeting_function) (void),
+                        void (*h_command_function) (void) ) ;
+void CtdlUnregisterServiceHook(int tcp_port,
+                       char *sockpath,
+                        void (*h_greeting_function) (void),
+                        void (*h_command_function) (void) ) ;
+
+#endif /* SERV_EXTENSIONS_H */
index 11c6063e6c1e49a39e9e00dee574f3eac307e460..0266427a0b83547141ec862afa7e39c6b1f56ff3 100644 (file)
@@ -44,7 +44,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
@@ -1228,8 +1228,7 @@ void imap_command_loop(void) {
 
 
 /*
- * This function is called by dynloader.c to register the IMAP module
- * with the Citadel server.
+ * This function is called to register the IMAP extension with Citadel.
  */
 char *serv_imap_init(void)
 {
index 90cb8273e93d2183e2fc09d02bf5c98b1516fc79..f585866c2b6f1d3c4da5eed60d33fd0cf77ca436 100644 (file)
@@ -38,7 +38,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index bba19f284c806ebfb2fb88413ae5c84f9bab3225..5ac5850e11df5cd3e7614062a7ee4bd9cef65584 100644 (file)
@@ -39,7 +39,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index 433039d824ec3b347c51ef124a01ece2667d31b5..a616a88edc42e33d2fa51a5d5bce503876b67909 100644 (file)
@@ -40,7 +40,7 @@
 #include "support.h"
 #include "config.h"
 #include "control.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index 5a3703c13c4fd2975cc4e202bfd68b9d19477be7..9585ae524f9939f25e7fc07de1c996002c4e5ba6 100644 (file)
@@ -37,7 +37,7 @@
 #include "support.h"
 #include "config.h"
 #include "control.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index cd906ca87c36daf37d2f67a7292044c6e19619e4..c286ecae9a6786f0313ba90e510c39d0b2e07344 100644 (file)
@@ -58,7 +58,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index b0bb189ce042ff94c20f1e16784cc53f10e67891..365dd3e581f6f4f28371cd91b307486a2add54d2 100644 (file)
@@ -41,7 +41,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index 9c22c86f40d91058ea73ebaf13eacb91e81f9da0..bae7fa347d19ef810df7e35e6a1540aac2eb446c 100644 (file)
@@ -26,7 +26,7 @@
 #include "server.h"
 #include "citserver.h"
 #include "support.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "user_ops.h"
 #include "md5.h"
 #include "tools.h"
index ee93d03b9611e36969466a79b78ae4a2d44009df..44e5017567b3d08e147e58eb040fb216ea173135 100644 (file)
@@ -48,7 +48,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index 2120e970ecdd496fd22586a16a45420d2ecfac1d..7645bf7fb20f46118f74d20058e2dc831dd7be6d 100644 (file)
@@ -37,7 +37,7 @@
 #include "support.h"
 #include "config.h"
 #include "control.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index 6fdac85dceffc5f4a877aa8a87d40e7da1055003..c0147df1155c2096ef9ce95f1cbb09323bfd1ca1 100644 (file)
@@ -38,7 +38,7 @@
 #include "support.h"
 #include "config.h"
 #include "control.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index 7efef8a90e08243aae19fc8ef67e9c5c37664a24..6922b0f091653260982441e0a71cd88545cf1fec 100644 (file)
@@ -41,7 +41,7 @@
 #include "support.h"
 #include "config.h"
 #include "control.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index 26b2373804e509a7ac781901cadcad9623f05c82..caf9af73bb15a6e8ef16f7c4eb9c832b99c79480 100644 (file)
@@ -35,7 +35,7 @@
 #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"
index b620e0417971bf18293dda874e7334f9562ab9a4..55840f88a89317c89affa9d8268c53ff89c1f178 100644 (file)
@@ -36,7 +36,7 @@
 #include "support.h"
 #include "config.h"
 #include "control.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "database.h"
 #include "room_ops.h"
 #include "user_ops.h"
index 056b65500d4c7a6e9a03b26d48a5919717dce895..f53c9626f46d07c323af46e4b40878793982442a 100644 (file)
@@ -36,7 +36,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "database.h"
 #include "msgbase.h"
 #include "tools.h"
index d03bef4b1bbcb18e64d5fc35ddab1ea2d4c0e268..6350dbfc57f364fa60813c95784ae7c70c6220c3 100644 (file)
@@ -54,7 +54,7 @@
 #include "support.h"
 #include "config.h"
 #include "control.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
index ad353e2383fa61ff04e669a282ecb2b9fe44b0ca..ad2b2b3bb8b9c1ad3beaec28b45efe97fe5b789f 100644 (file)
@@ -42,7 +42,7 @@
 #endif
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "sysdep_decls.h"
 #include "citserver.h"
 #include "support.h"
index 4a3b106e205de4e0860031bfe847a750490b6d25..401f04d3877744be9abd46eccdbfe23053bd0139 100644 (file)
@@ -54,7 +54,7 @@
 #endif
 #include "citadel.h"
 #include "server.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "sysdep_decls.h"
 #include "citserver.h"
 #include "support.h"
index 0dfad787acdb54b5d2be2e8ee810b10ba367b700..5e8acacd082a6f5280318ae75bee55877fe73de1 100644 (file)
@@ -42,7 +42,7 @@
 #include "server.h"
 #include "database.h"
 #include "user_ops.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "sysdep_decls.h"
 #include "support.h"
 #include "room_ops.h"