struct XmsgFunctionHook *XmsgHookTable = NULL;
struct MessageFunctionHook *MessageHookTable = NULL;
struct NetprocFunctionHook *NetprocHookTable = NULL;
+struct DeleteFunctionHook *DeleteHookTable = NULL;
struct ServiceFunctionHook *ServiceHookTable = NULL;
struct ProtoFunctionHook {
}
-void CtdlRegisterNetprocHook(int (*handler)(struct CtdlMessage *) )
+void CtdlRegisterNetprocHook(int (*handler)(struct CtdlMessage *, char *) )
{
struct NetprocFunctionHook *newfcn;
}
-void CtdlUnregisterNetprocHook(int (*handler)(struct CtdlMessage *) )
+void CtdlUnregisterNetprocHook(int (*handler)(struct CtdlMessage *, char *) )
{
struct NetprocFunctionHook *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)
{
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");
}
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) {
-int PerformNetprocHooks(struct CtdlMessage *msg)
+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);
+ (*fcn->h_function_pointer) (msg, target_room);
}
/* Return the sum of the return codes from the hook functions.
}
+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)
{