]> jfr.im git - irc/quakenet/newserv.git/blob - core/hooks.c
sync Dan's live P changes - a) dont start scanning for first 120s after boot b) dont...
[irc/quakenet/newserv.git] / core / hooks.c
1 /* hooks.c */
2
3 #include "hooks.h"
4 #include <assert.h>
5 #include "../lib/array.h"
6
7 array hooks[HOOKMAX];
8
9 void inithooks() {
10 int i;
11
12 hookqueuelength=0;
13 for (i=0;i<HOOKMAX;i++) {
14 array_init(&(hooks[i]),sizeof(HookCallback));
15 array_setlim1(&(hooks[i]),2);
16 array_setlim2(&(hooks[i]),2);
17 }
18 }
19
20 int registerhook(int hooknum, HookCallback callback) {
21 int i;
22 HookCallback *hcbs;
23
24 if (hooknum>HOOKMAX)
25 return 1;
26
27 hcbs=(HookCallback *)(hooks[hooknum].content);
28 for(i=0;i<hooks[hooknum].cursi;i++)
29 if(hcbs[i]==callback)
30 return 1;
31
32 i=array_getfreeslot(&hooks[hooknum]);
33 hcbs=(HookCallback *)(hooks[hooknum].content);
34 hcbs[i]=callback;
35
36 return 0;
37 }
38
39 int deregisterhook(int hooknum, HookCallback callback) {
40 int i;
41 HookCallback *hcbs;
42
43 if (hooknum>HOOKMAX)
44 return 1;
45
46 hcbs=(HookCallback *)(hooks[hooknum].content);
47
48 for(i=0;i<hooks[hooknum].cursi;i++)
49 if(hcbs[i]==callback) {
50 array_delslot(&(hooks[hooknum]),i);
51 return 0;
52 }
53
54 return 1;
55 }
56
57 void triggerhook(int hooknum, void *arg) {
58 int i;
59 HookCallback *hcbs;
60
61 if (hooknum>HOOKMAX)
62 return;
63
64 hookqueuelength++;
65 hcbs=(HookCallback *)(hooks[hooknum].content);
66 for (i=0;i<hooks[hooknum].cursi;i++) {
67 (hcbs[i])(hooknum, arg);
68 }
69 hookqueuelength--;
70
71 if (!hookqueuelength && hooknum!=HOOK_CORE_ENDOFHOOKSQUEUE)
72 triggerhook(HOOK_CORE_ENDOFHOOKSQUEUE, 0);
73 }
74