]> code.citadel.org Git - citadel.git/blobdiff - citadel/dynloader.c
- port to Cygwin (DLL support, etc.)
[citadel.git] / citadel / dynloader.c
index d11ca6790dcdf701cb98522fe80af0daa4e5112e..251ca2deec08de187cb04e81cf474990de84ec44 100644 (file)
@@ -1,25 +1,29 @@
-/*******************************************************
+/*
+ * $Id$
  *
  * Citadel Dynamic Loading Module
- * Written by Brian Costello
- * btx@calyx.net
- *
- * $Id$
+ * Written by Brian Costello <btx@calyx.net>
  *
- ******************************************************/
+ */
 
+#ifdef DLL_EXPORT
+#define IN_LIBCIT
+#endif
 
 #include "sysdep.h"
 #include <stdio.h>
 #include <stdlib.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 <strings.h>
+#include <string.h>
 #include <syslog.h>
-#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
-#endif
 #include <limits.h>
 #include <ctype.h>
 #include "citadel.h"
@@ -28,6 +32,7 @@
 #include "sysdep_decls.h"
 #include "msgbase.h"
 #include "tools.h"
+#include "config.h"
 
 #ifndef HAVE_SNPRINTF
 #include <stdarg.h>
@@ -40,6 +45,7 @@ struct SessionFunctionHook *SessionHookTable = NULL;
 struct UserFunctionHook *UserHookTable = NULL;
 struct XmsgFunctionHook *XmsgHookTable = NULL;
 struct MessageFunctionHook *MessageHookTable = NULL;
+struct ServiceFunctionHook *ServiceHookTable = NULL;
 
 struct ProtoFunctionHook {
        void (*handler) (char *cmdbuf);
@@ -80,7 +86,7 @@ int DLoader_Exec_Cmd(char *cmdbuf)
 void DLoader_Init(char *pathname)
 {
        void *fcn_handle;
-       char dl_error[256];
+       char dl_error[SIZ];
        DIR *dir;
        int i;
        struct dirent *dptr;
@@ -96,12 +102,18 @@ void DLoader_Init(char *pathname)
        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);
-#ifdef RTLD_NOW
-               if (!(fcn_handle = dlopen(pathbuf, RTLD_NOW)))
+               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
@@ -230,6 +242,49 @@ void CtdlRegisterXmsgHook(int (*fcn_ptr) (char *, char *, char *), int order)
        lprintf(5, "Registered a new x-msg function (priority %d)\n", order);
 }
 
+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);
+               sprintf(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);
+               sprintf(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 PerformSessionHooks(int EventType)
 {
@@ -271,9 +326,9 @@ int PerformMessageHooks(struct CtdlMessage *msg, int EventType)
 
        /* 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);