]> code.citadel.org Git - citadel.git/blobdiff - citadel/dynloader.c
removed all references to sprintf from several files (not all files yet)
[citadel.git] / citadel / dynloader.c
index 15c8ef7de4a2361c3cffd7c6738ce07fff425bdc..c1e3c64b3d60e42395f9f11c3301eff2372a6756 100644 (file)
@@ -46,6 +46,8 @@ 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 {
@@ -363,6 +365,74 @@ void CtdlUnregisterMessageHook(int (*handler)(struct CtdlMessage *),
 }
 
 
+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)
 {
 
@@ -418,7 +488,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");
@@ -427,7 +497,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) {
@@ -543,6 +613,34 @@ int PerformMessageHooks(struct CtdlMessage *msg, int EventType)
 
 
 
+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;