int loglevel;
void (*h_function_pointer) (char *);
};
-extern LogFunctionHook *LogHookTable;
+
+LogFunctionHook *LogHookTable = NULL;
typedef struct FixedOutputHook FixedOutputHook;
struct FixedOutputHook {
char content_type[64];
void (*h_function_pointer) (char *, int);
};
-extern FixedOutputHook *FixedOutputTable;
+FixedOutputHook *FixedOutputTable = NULL;
+
+
+
+/*
+ * TDAPVetoHookFunctionHook extensions are used for any type of hook for which
+ * may prevent the autopurger to run for this specific data class.
+ * the function should at least LOG_INFO that it does so.
+ */
+typedef struct TDAPVetoHookFunctionHook TDAPVetoHookFunctionHook;
+struct TDAPVetoHookFunctionHook {
+ TDAPVetoHookFunctionHook *next;
+ int Priority;
+ int (*h_function_pointer) (StrBuf *);
+ int eventtype;
+};
+TDAPVetoHookFunctionHook *TDAPVetoHookTable = NULL;
void (*h_function_pointer) (void);
int eventtype;
};
-extern SessionFunctionHook *SessionHookTable;
-
+SessionFunctionHook *SessionHookTable = NULL;
/*
* UserFunctionHook extensions are used for any type of hook which implements
void (*h_function_pointer) (struct ctdluser *usbuf);
int eventtype;
};
-extern UserFunctionHook *UserHookTable;
+UserFunctionHook *UserHookTable = NULL;
/*
* MessageFunctionHook extensions are used for hooks which implement handlers
int (*h_function_pointer) (struct CtdlMessage *msg);
int eventtype;
};
-extern MessageFunctionHook *MessageHookTable;
+MessageFunctionHook *MessageHookTable = NULL;
/*
NetprocFunctionHook *next;
int (*h_function_pointer) (struct CtdlMessage *msg, char *target_room);
};
-extern NetprocFunctionHook *NetprocHookTable;
+NetprocFunctionHook *NetprocHookTable = NULL;
/*
DeleteFunctionHook *next;
void (*h_function_pointer) (char *target_room, long msgnum);
};
-extern DeleteFunctionHook *DeleteHookTable;
+DeleteFunctionHook *DeleteHookTable = NULL;
/*
int (*h_function_pointer) (char *, char *, char *, char *);
int order;
};
-extern XmsgFunctionHook *XmsgHookTable;
+XmsgFunctionHook *XmsgHookTable = NULL;
RoomFunctionHook *next;
int (*fcn_ptr) (struct ctdlroom *);
};
-extern RoomFunctionHook *RoomHookTable;
+RoomFunctionHook *RoomHookTable = NULL;
void (*fcn_ptr) (int *, long **, const char *);
char *name;
};
-extern SearchFunctionHook *SearchFunctionHookTable;
-
+SearchFunctionHook *SearchFunctionHookTable = NULL;
CleanupFunctionHook *CleanupHookTable = NULL;
CleanupFunctionHook *EVCleanupHookTable = NULL;
-SessionFunctionHook *SessionHookTable = NULL;
-UserFunctionHook *UserHookTable = NULL;
-XmsgFunctionHook *XmsgHookTable = NULL;
-MessageFunctionHook *MessageHookTable = NULL;
-NetprocFunctionHook *NetprocHookTable = NULL;
-DeleteFunctionHook *DeleteHookTable = NULL;
+
ServiceFunctionHook *ServiceHookTable = NULL;
-FixedOutputHook *FixedOutputTable = NULL;
-RoomFunctionHook *RoomHookTable = NULL;
-SearchFunctionHook *SearchFunctionHookTable = NULL;
typedef struct ProtoFunctionHook ProtoFunctionHook;
struct ProtoFunctionHook {
EVCleanupHookTable = NULL;
}
+void CtdlRegisterTDAPVetoHook(int (*fcn_ptr) (StrBuf*), int EventType, int Priority)
+{
+ TDAPVetoHookFunctionHook *newfcn;
+
+ newfcn = (TDAPVetoHookFunctionHook *)
+ malloc(sizeof(TDAPVetoHookFunctionHook));
+ newfcn->Priority = Priority;
+ newfcn->h_function_pointer = fcn_ptr;
+ newfcn->eventtype = EventType;
+
+ TDAPVetoHookFunctionHook **pfcn;
+ pfcn = &TDAPVetoHookTable;
+ while ((*pfcn != NULL) &&
+ ((*pfcn)->Priority < newfcn->Priority) &&
+ ((*pfcn)->next != NULL))
+ pfcn = &(*pfcn)->next;
+
+ newfcn->next = *pfcn;
+ *pfcn = newfcn;
+
+ MOD_syslog(LOG_DEBUG, "Registered a new TDAP Veto function (type %d Priority %d)\n",
+ EventType, Priority);
+}
+
+
+void CtdlUnregisterTDAPVetoHook(int (*fcn_ptr) (StrBuf*), int EventType)
+{
+ TDAPVetoHookFunctionHook *cur, *p, *last;
+ last = NULL;
+ cur = TDAPVetoHookTable;
+ while (cur != NULL) {
+ if ((fcn_ptr == cur->h_function_pointer) &&
+ (EventType == cur->eventtype))
+ {
+ MOD_syslog(LOG_DEBUG, "Unregistered TDAP Veto function (type %d)\n",
+ EventType);
+ p = cur->next;
+
+ free(cur);
+ cur = NULL;
+
+ if (last != NULL)
+ last->next = p;
+ else
+ TDAPVetoHookTable = p;
+ cur = p;
+ }
+ else {
+ last = cur;
+ cur = cur->next;
+ }
+ }
+}
+
+void CtdlDestroyTDAPVetoHooks(void)
+{
+ TDAPVetoHookFunctionHook *cur, *p;
+
+ cur = TDAPVetoHookTable;
+ while (cur != NULL)
+ {
+ MODM_syslog(LOG_DEBUG, "Destroyed TDAP Veto function\n");
+ p = cur->next;
+ free(cur);
+ cur = p;
+ }
+ TDAPVetoHookTable = NULL;
+}
+
void CtdlRegisterSessionHook(void (*fcn_ptr) (void), int EventType, int Priority)
{
void CtdlDestroyServiceHook(void)
{
+ const char *Text;
ServiceFunctionHook *cur, *p;
cur = ServiceHookTable;
while (cur != NULL)
{
- close(cur->msock);
+ if (cur->msock != -1)
+ {
+ close(cur->msock);
+ Text = "Closed";
+ }
+ else
+ {
+ Text = " Not closing again";
+ }
+
if (cur->sockpath) {
- MOD_syslog(LOG_INFO, "Closed UNIX domain socket %s\n",
+ MOD_syslog(LOG_INFO, "%s UNIX domain socket %s\n",
+ Text,
cur->sockpath);
unlink(cur->sockpath);
} else if (cur->tcp_port) {
- MOD_syslog(LOG_INFO, "Closed TCP port %d\n", cur->tcp_port);
+ MOD_syslog(LOG_INFO, "%s TCP port %d\n", Text, cur->tcp_port);
} else {
MOD_syslog(LOG_INFO, "Destroyed service \"%s\"\n", cur->ServiceName);
}
*num_msgs = 0;
}
+int CheckTDAPVeto (int DBType, StrBuf *ErrMsg)
+{
+ int Result = 0;
+ TDAPVetoHookFunctionHook *fcn = NULL;
+
+ for (fcn = TDAPVetoHookTable; (fcn != NULL) && (Result == 0); fcn = fcn->next) {
+ if (fcn->eventtype == DBType) {
+ Result = (*fcn->h_function_pointer) (ErrMsg);
+ }
+ }
+ return Result;
+}
void PerformSessionHooks(int EventType)
{