From: Art Cancro Date: Thu, 16 Jan 2003 03:41:46 +0000 (+0000) Subject: * Renamed "dynloader" to "serv_extensions" globally. We don't want people X-Git-Tag: v7.86~6037 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=4d2ba3513d914336f68942ec89117941c081af9d * 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. --- diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 6fccc8d09..d88981748 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -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 Fri Jul 10 1998 Art Cancro * Initial CVS import + diff --git a/citadel/Makefile.in b/citadel/Makefile.in index 1648bf18b..b8ef01f26 100644 --- a/citadel/Makefile.in +++ b/citadel/Makefile.in @@ -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 \ diff --git a/citadel/bootstrap b/citadel/bootstrap index 998f9be70..abbe5c162 100755 --- a/citadel/bootstrap +++ b/citadel/bootstrap @@ -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 diff --git a/citadel/citserver.c b/citadel/citserver.c index 86e30c91b..783111760 100644 --- a/citadel/citserver.c +++ b/citadel/citserver.c @@ -40,7 +40,7 @@ #include #include "citadel.h" #include "server.h" -#include "dynloader.h" +#include "serv_extensions.h" #include "sysdep_decls.h" #include "citserver.h" #include "config.h" diff --git a/citadel/citserver.h b/citadel/citserver.h index ac55073bf..3985bebd0 100644 --- a/citadel/citserver.h +++ b/citadel/citserver.h @@ -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 { diff --git a/citadel/clientsocket.c b/citadel/clientsocket.c index 0c6d401c2..24aa21e6b 100644 --- a/citadel/clientsocket.c +++ b/citadel/clientsocket.c @@ -29,7 +29,7 @@ #include #include "citadel.h" #include "server.h" -#include "dynloader.h" +#include "serv_extensions.h" #ifndef HAVE_SNPRINTF #include "snprintf.h" #endif diff --git a/citadel/config.c b/citadel/config.c index 117f2bf2c..0a305151b 100644 --- a/citadel/config.c +++ b/citadel/config.c @@ -20,7 +20,7 @@ #include #include "citadel.h" #include "server.h" -#include "dynloader.h" +#include "serv_extensions.h" #include "config.h" struct config config; diff --git a/citadel/config.h b/citadel/config.h index e33d5427e..7e3801679 100644 --- a/citadel/config.h +++ b/citadel/config.h @@ -3,7 +3,7 @@ * */ -#include "dynloader.h" +#include "serv_extensions.h" void get_config(void); void put_config(void); diff --git a/citadel/control.c b/citadel/control.c index d1baeae50..b69dded6f 100644 --- a/citadel/control.c +++ b/citadel/control.c @@ -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" diff --git a/citadel/database_sleepycat.c b/citadel/database_sleepycat.c index 7678f6aab..df38f880d 100644 --- a/citadel/database_sleepycat.c +++ b/citadel/database_sleepycat.c @@ -46,7 +46,7 @@ #include #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 index 07295ba52..000000000 --- a/citadel/dynloader.c +++ /dev/null @@ -1,619 +0,0 @@ -/* - * $Id$ - * - * Citadel Dynamic Loading Module - * Written by Brian Costello - * - */ - -#include "sysdep.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#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 -#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; pnext) { - 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 index 69b26bfe7..000000000 --- a/citadel/dynloader.h +++ /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 */ diff --git a/citadel/file_ops.c b/citadel/file_ops.c index b016cba47..c9ab9b156 100644 --- a/citadel/file_ops.c +++ b/citadel/file_ops.c @@ -33,7 +33,7 @@ #include #include "citadel.h" #include "server.h" -#include "dynloader.h" +#include "serv_extensions.h" #include "config.h" #include "file_ops.h" #include "sysdep_decls.h" diff --git a/citadel/housekeeping.c b/citadel/housekeeping.c index 98d4c2c16..c0eb5d2cc 100644 --- a/citadel/housekeeping.c +++ b/citadel/housekeeping.c @@ -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" diff --git a/citadel/html.c b/citadel/html.c index d717393b4..af5c6e66b 100644 --- a/citadel/html.c +++ b/citadel/html.c @@ -35,7 +35,7 @@ #include #include "citadel.h" #include "server.h" -#include "dynloader.h" +#include "serv_extensions.h" #include "control.h" #include "sysdep_decls.h" #include "support.h" diff --git a/citadel/imap_fetch.c b/citadel/imap_fetch.c index c1751fa05..a17e47da3 100644 --- a/citadel/imap_fetch.c +++ b/citadel/imap_fetch.c @@ -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" diff --git a/citadel/imap_misc.c b/citadel/imap_misc.c index 1c5cc0bce..ab03090b1 100644 --- a/citadel/imap_misc.c +++ b/citadel/imap_misc.c @@ -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" diff --git a/citadel/imap_search.c b/citadel/imap_search.c index 4158c0b78..9fd6b34b9 100644 --- a/citadel/imap_search.c +++ b/citadel/imap_search.c @@ -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" diff --git a/citadel/imap_store.c b/citadel/imap_store.c index ec2de6f4f..e3ce69b5b 100644 --- a/citadel/imap_store.c +++ b/citadel/imap_store.c @@ -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" diff --git a/citadel/internet_addressing.c b/citadel/internet_addressing.c index 6533f2c2d..ca45a4b09 100644 --- a/citadel/internet_addressing.c +++ b/citadel/internet_addressing.c @@ -36,7 +36,7 @@ #include #include "citadel.h" #include "server.h" -#include "dynloader.h" +#include "serv_extensions.h" #include "sysdep_decls.h" #include "citserver.h" #include "support.h" diff --git a/citadel/locate_host.c b/citadel/locate_host.c index 7e30b46f2..3f50fe60a 100644 --- a/citadel/locate_host.c +++ b/citadel/locate_host.c @@ -22,7 +22,7 @@ #include #include "citadel.h" #include "server.h" -#include "dynloader.h" +#include "serv_extensions.h" #include "locate_host.h" #include "sysdep_decls.h" #include "config.h" diff --git a/citadel/mime_parser.c b/citadel/mime_parser.c index afc719803..e4d1e13cd 100644 --- a/citadel/mime_parser.c +++ b/citadel/mime_parser.c @@ -24,7 +24,7 @@ #include "citadel.h" #include "server.h" -#include "dynloader.h" +#include "serv_extensions.h" #include "sysdep_decls.h" #include "tools.h" diff --git a/citadel/msgbase.c b/citadel/msgbase.c index e11fb12b1..622f1f1a2 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -36,7 +36,7 @@ #include #include "citadel.h" #include "server.h" -#include "dynloader.h" +#include "serv_extensions.h" #include "database.h" #include "msgbase.h" #include "support.h" diff --git a/citadel/policy.c b/citadel/policy.c index d30160400..6ce8ed570 100644 --- a/citadel/policy.c +++ b/citadel/policy.c @@ -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" diff --git a/citadel/room_ops.c b/citadel/room_ops.c index fdba64de0..a2ef5da7b 100644 --- a/citadel/room_ops.c +++ b/citadel/room_ops.c @@ -31,7 +31,7 @@ #include #include "citadel.h" #include "server.h" -#include "dynloader.h" +#include "serv_extensions.h" #include "database.h" #include "config.h" #include "room_ops.h" diff --git a/citadel/sendcommand.c b/citadel/sendcommand.c index ca0d606e6..9960af667 100644 --- a/citadel/sendcommand.c +++ b/citadel/sendcommand.c @@ -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" diff --git a/citadel/serv_bio.c b/citadel/serv_bio.c index 66b79c9aa..62d313f42 100644 --- a/citadel/serv_bio.c +++ b/citadel/serv_bio.c @@ -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" diff --git a/citadel/serv_calendar.c b/citadel/serv_calendar.c index b274481f8..4d77cf327 100644 --- a/citadel/serv_calendar.c +++ b/citadel/serv_calendar.c @@ -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" diff --git a/citadel/serv_chat.c b/citadel/serv_chat.c index fcb724f1c..9d005dfe9 100644 --- a/citadel/serv_chat.c +++ b/citadel/serv_chat.c @@ -31,7 +31,7 @@ #include #include "citadel.h" #include "server.h" -#include "dynloader.h" +#include "serv_extensions.h" #include #include "serv_chat.h" #include "sysdep_decls.h" diff --git a/citadel/serv_crypto.c b/citadel/serv_crypto.c index 26a540d2f..7a87f064f 100644 --- a/citadel/serv_crypto.c +++ b/citadel/serv_crypto.c @@ -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 diff --git a/citadel/serv_expire.c b/citadel/serv_expire.c index c3a22eb47..83a39308a 100644 --- a/citadel/serv_expire.c +++ b/citadel/serv_expire.c @@ -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 index 000000000..286fe5b32 --- /dev/null +++ b/citadel/serv_extensions.c @@ -0,0 +1,619 @@ +/* + * $Id$ + * + * Citadel Dynamic Loading Module + * Written by Brian Costello + * + */ + +#include "sysdep.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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 +#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; pnext) { + 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 index 000000000..1f55607d0 --- /dev/null +++ b/citadel/serv_extensions.h @@ -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 */ diff --git a/citadel/serv_imap.c b/citadel/serv_imap.c index 11c6063e6..0266427a0 100644 --- a/citadel/serv_imap.c +++ b/citadel/serv_imap.c @@ -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) { diff --git a/citadel/serv_inetcfg.c b/citadel/serv_inetcfg.c index 90cb8273e..f585866c2 100644 --- a/citadel/serv_inetcfg.c +++ b/citadel/serv_inetcfg.c @@ -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" diff --git a/citadel/serv_listsub.c b/citadel/serv_listsub.c index bba19f284..5ac5850e1 100644 --- a/citadel/serv_listsub.c +++ b/citadel/serv_listsub.c @@ -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" diff --git a/citadel/serv_mrtg.c b/citadel/serv_mrtg.c index 433039d82..a616a88ed 100644 --- a/citadel/serv_mrtg.c +++ b/citadel/serv_mrtg.c @@ -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" diff --git a/citadel/serv_netfilter.c b/citadel/serv_netfilter.c index 5a3703c13..9585ae524 100644 --- a/citadel/serv_netfilter.c +++ b/citadel/serv_netfilter.c @@ -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" diff --git a/citadel/serv_network.c b/citadel/serv_network.c index cd906ca87..c286ecae9 100644 --- a/citadel/serv_network.c +++ b/citadel/serv_network.c @@ -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" diff --git a/citadel/serv_newuser.c b/citadel/serv_newuser.c index b0bb189ce..365dd3e58 100644 --- a/citadel/serv_newuser.c +++ b/citadel/serv_newuser.c @@ -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" diff --git a/citadel/serv_pas2.c b/citadel/serv_pas2.c index 9c22c86f4..bae7fa347 100644 --- a/citadel/serv_pas2.c +++ b/citadel/serv_pas2.c @@ -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" diff --git a/citadel/serv_pop3.c b/citadel/serv_pop3.c index ee93d03b9..44e501756 100644 --- a/citadel/serv_pop3.c +++ b/citadel/serv_pop3.c @@ -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" diff --git a/citadel/serv_rwho.c b/citadel/serv_rwho.c index 2120e970e..7645bf7fb 100644 --- a/citadel/serv_rwho.c +++ b/citadel/serv_rwho.c @@ -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" diff --git a/citadel/serv_smtp.c b/citadel/serv_smtp.c index 6fdac85dc..c0147df11 100644 --- a/citadel/serv_smtp.c +++ b/citadel/serv_smtp.c @@ -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" diff --git a/citadel/serv_spam.c b/citadel/serv_spam.c index 7efef8a90..6922b0f09 100644 --- a/citadel/serv_spam.c +++ b/citadel/serv_spam.c @@ -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" diff --git a/citadel/serv_test.c b/citadel/serv_test.c index 26b237380..caf9af73b 100644 --- a/citadel/serv_test.c +++ b/citadel/serv_test.c @@ -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" diff --git a/citadel/serv_upgrade.c b/citadel/serv_upgrade.c index b620e0417..55840f88a 100644 --- a/citadel/serv_upgrade.c +++ b/citadel/serv_upgrade.c @@ -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" diff --git a/citadel/serv_vandelay.c b/citadel/serv_vandelay.c index 056b65500..f53c9626f 100644 --- a/citadel/serv_vandelay.c +++ b/citadel/serv_vandelay.c @@ -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" diff --git a/citadel/serv_vcard.c b/citadel/serv_vcard.c index d03bef4b1..6350dbfc5 100644 --- a/citadel/serv_vcard.c +++ b/citadel/serv_vcard.c @@ -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" diff --git a/citadel/server_main.c b/citadel/server_main.c index ad353e238..ad2b2b3bb 100644 --- a/citadel/server_main.c +++ b/citadel/server_main.c @@ -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" diff --git a/citadel/sysdep.c b/citadel/sysdep.c index 4a3b106e2..401f04d38 100644 --- a/citadel/sysdep.c +++ b/citadel/sysdep.c @@ -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" diff --git a/citadel/user_ops.c b/citadel/user_ops.c index 0dfad787a..5e8acacd0 100644 --- a/citadel/user_ops.c +++ b/citadel/user_ops.c @@ -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"