]> code.citadel.org Git - citadel.git/blobdiff - citadel/dynloader.c
* event.c: fixed a misspelling
[citadel.git] / citadel / dynloader.c
index 6647fee2c479fd3c84191688e3ae26edd4dfa2b1..07295ba52d8f49d7ee82f8b3192231e719f3e0d8 100644 (file)
@@ -6,21 +6,10 @@
  *
  */
 
-#ifdef DLL_EXPORT
-#define IN_LIBCIT
-#endif
-
 #include "sysdep.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
-#ifdef HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-#ifdef HAVE_DL_H
-#include <dl.h>
-#include "hpsux.h"
-#endif
 #include <sys/types.h>
 #include <dirent.h>
 #include <string.h>
@@ -47,6 +36,7 @@ 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 {
@@ -111,64 +101,28 @@ int DLoader_Exec_Cmd(char *cmdbuf)
        return 0;
 }
 
-void DLoader_Init(char *pathname)
+void initialize_server_extensions(void)
 {
-       void *fcn_handle;
-       char dl_error[SIZ];
-       DIR *dir;
-       int i;
-       struct dirent *dptr;
-       char *(*h_init_fcn) (void);
-       char *dl_info;
-
-       char pathbuf[PATH_MAX];
-
-       if ((dir = opendir(pathname)) == NULL) {
-               perror("opendir");
-               exit(1);
-       }
-       while ((dptr = readdir(dir)) != NULL) {
-               if (strlen(dptr->d_name) < 4)
-                       continue;
-#ifndef __CYGWIN__
-               if (strcasecmp(&dptr->d_name[strlen(dptr->d_name)-3], ".so"))
-#else
-               if (strcasecmp(&dptr->d_name[strlen(dptr->d_name)-4], ".dll"))
-#endif
-                       continue;
-
-               snprintf(pathbuf, PATH_MAX, "%s/%s", pathname, dptr->d_name);
-               lprintf(7, "Initializing %s...\n", pathbuf);
-
-#ifdef RTLD_LAZY
-               if (!(fcn_handle = dlopen(pathbuf, RTLD_LAZY)))
-#else                          /* OpenBSD */
-               if (!(fcn_handle = dlopen(pathbuf, DL_LAZY)))
-#endif
-               {
-                       safestrncpy(dl_error, dlerror(), sizeof dl_error);
-                       for (i=0; i<strlen(dl_error); ++i)
-                               if (!isprint(dl_error[i]))
-                                       dl_error[i]='.';
-                       fprintf(stderr, "DLoader_Init dlopen failed: %s\n",
-                               dl_error);
-                       continue;
-               }
-               h_init_fcn = (char * (*)(void))
-#ifndef __OpenBSD__
-                   dlsym(fcn_handle, "Dynamic_Module_Init");
-#else
-                   dlsym(fcn_handle, "_Dynamic_Module_Init");
-#endif
-
-               if (dlerror() != NULL) {
-                       fprintf(stderr, "DLoader_Init dlsym failed\n");
-                       continue;
-               }
-               dl_info = h_init_fcn();
-
-               lprintf(3, "Loaded module: %s\n", dl_info);
-       }       /* While */
+       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();
 }
 
 
@@ -398,6 +352,40 @@ void CtdlUnregisterNetprocHook(int (*handler)(struct CtdlMessage *, char *) )
 }
 
 
+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)
 {
 
@@ -453,7 +441,7 @@ void CtdlRegisterServiceHook(int tcp_port,
 
        if (sockpath != NULL) {
                newfcn->msock = ig_uds_server(sockpath, config.c_maxsessions);
-               sprintf(message, "Unix domain socket '%s': ", sockpath);
+               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");
@@ -462,7 +450,7 @@ void CtdlRegisterServiceHook(int tcp_port,
        }
        else {
                newfcn->msock = ig_tcp_server(tcp_port, config.c_maxsessions);
-               sprintf(message, "TCP port %d: ", tcp_port);
+               snprintf(message, sizeof message, "TCP port %d: ", tcp_port);
        }
 
        if (newfcn->msock > 0) {
@@ -595,6 +583,16 @@ int PerformNetprocHooks(struct CtdlMessage *msg, char *target_room)
 }
 
 
+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)
 {