3 #include "../lib/version.h"
4 #include "../core/hooks.h"
5 #include "../core/error.h"
6 #include "../core/nsmalloc.h"
7 #include "../server/server.h"
12 void trusts_registerevents(void);
13 void trusts_deregisterevents(void);
15 static void statusfn(int, void *);
16 static void whoisfn(int, void *);
18 static sstring
*tgextnames
[MAXTGEXTS
];
20 int trusts_thext
, trusts_nextuserext
;
24 trusts_thext
= registernickext("trustth");
25 if(trusts_thext
== -1) {
26 Error("trusts", ERR_ERROR
, "Unable to register first nick extension.");
30 trusts_nextuserext
= registernickext("trustnext");
31 if(trusts_thext
== -1) {
32 releasenickext(trusts_thext
);
33 Error("trusts", ERR_ERROR
, "Unable to register second nick extension.");
37 registerhook(HOOK_CORE_STATSREQUEST
, statusfn
);
38 registerhook(HOOK_CONTROL_WHOISREQUEST
, &whoisfn
);
39 trusts_registerevents();
43 if(trusts_thext
!= -1) {
44 releasenickext(trusts_thext
);
45 releasenickext(trusts_nextuserext
);
48 deregisterhook(HOOK_CORE_STATSREQUEST
, statusfn
);
49 deregisterhook(HOOK_CONTROL_WHOISREQUEST
, &whoisfn
);
50 trusts_deregisterevents();
52 nscheckfreeall(POOL_TRUSTS
);
55 static void whoisfn(int hooknum
, void *arg
) {
58 nick
*np
= (nick
*)arg
;
63 th
= gettrusthost(np
);
68 snprintf(message
, sizeof(message
), "Trustgroup: %s (#%d)", th
->group
->name
->content
, th
->group
->id
);
69 triggerhook(HOOK_CONTROL_WHOISREPLY
, message
);
70 if(th
->group
->trustedfor
>0) {
71 snprintf(message
, sizeof(message
), "Trustgroup: Usage: %d/%d", th
->group
->count
, th
->group
->trustedfor
);
72 triggerhook(HOOK_CONTROL_WHOISREPLY
, message
);
74 if(th
->maxpernode
>0) {
75 snprintf(message
, sizeof(message
), "Trusthost : %s", CIDRtostr(np
->p_ipaddr
, th
->nodebits
));
76 triggerhook(HOOK_CONTROL_WHOISREPLY
, message
);
78 patricia_node_t
*node
;
81 node
= refnode(iptree
, &(np
->p_ipaddr
), th
->nodebits
);
82 usercount
= node
->usercount
;
83 derefnode(iptree
, node
);
85 snprintf(message
, sizeof(message
), "Trusthost : Usage: %d/%d", usercount
, th
->maxpernode
);
86 triggerhook(HOOK_CONTROL_WHOISREPLY
, message
);
88 snprintf(message
, sizeof(message
), "Trusthost : %s", CIDRtostr(th
->ip
, th
->bits
));
89 triggerhook(HOOK_CONTROL_WHOISREPLY
, message
);
93 static void statusfn(int hooknum
, void *arg
) {
96 int groupcount
= 0, hostcount
= 0, usercount
= 0;
100 for(tg
=tglist
;tg
;tg
=tg
->next
) {
101 usercount
+=tg
->count
;
103 for(th
=tg
->hosts
;th
;th
=th
->next
)
107 snprintf(message
, sizeof(message
), "Trusts :%7d groups, %7d hosts, %7d users", groupcount
, hostcount
, usercount
);
108 triggerhook(HOOK_CORE_STATSREPLY
, message
);
112 int findtgext(const char *name
) {
115 for(i
=0;i
<MAXTGEXTS
;i
++)
116 if(tgextnames
[i
] && !strcmp(name
, tgextnames
[i
]->content
))
122 int registertgext(const char *name
) {
125 if(findtgext(name
) != -1) {
126 Error("trusts", ERR_WARNING
, "Tried to register duplicate trust group extension: %s.", name
);
130 for(i
=0;i
<MAXNICKEXTS
;i
++) {
132 tgextnames
[i
] = getsstring(name
, 100);
137 Error("trusts", ERR_WARNING
, "Tried to register too many trust group extensions: %s.", name
);
141 void releasetgext(int index
) {
144 freesstring(tgextnames
[index
]);
145 tgextnames
[index
] = NULL
;
147 for(tg
=tglist
;tg
;tg
=tg
->next
)
148 tg
->exts
[index
] = NULL
;
151 int trusts_fullyonline(void) {
155 return serverlist
[myhub
].linkstate
== LS_LINKED
;