]>
jfr.im git - irc/quakenet/newserv.git/blob - jupe/jupe.c
4 #include "../core/hooks.h"
5 #include "../lib/sstring.h"
6 #include "../server/server.h"
7 #include "../irc/irc.h"
8 #include "../core/error.h"
9 #include "../lib/irc_string.h"
14 int handlejupe(void *source
, int cargc
, char **cargv
);
15 void sendjupeburst(int hook
, void *args
);
20 registerhook(HOOK_IRC_SENDBURSTBURSTS
, &sendjupeburst
);
22 registerserverhandler("JU", &handlejupe
, 5);
29 /* keep a pointer to the next item */
30 next
= jupes
->ju_next
;
37 deregisterhook(HOOK_IRC_SENDBURSTBURSTS
, &sendjupeburst
);
39 deregisterserverhandler("JU", &handlejupe
);
42 int handlejupe(void *source
, int cargc
, char **cargv
) {
43 char *target
, *server
, *expire
, *modtime
, *reason
;
44 jupe_t
*jupe
, *last_jupe
;
48 return CMD_OK
; /* local jupe or not a valid.. we don't care */
56 if (atoi(expire
) > JUPE_MAX_EXPIRE
|| atoi(expire
) <= 0)
57 return; /* jupe's expiry date is not valid */
59 if (server
[0] != '+' && server
[0] != '-')
60 return CMD_OK
; /* not a valid jupe either */
62 flags
= (server
[0] == '+') ? JUPE_ACTIVE
: 0;
66 jupe
= jupe_find(server
);
68 if (jupe
!= NULL
&& atoi(modtime
) > jupe
->ju_lastmod
) {
69 jupe
->ju_flags
= flags
;
70 jupe
->ju_lastmod
= atoi(modtime
);
72 Error("jupe", ERR_WARNING
, "jupe modified for %s (%s) expiring in %s,"
73 " lastmod: %s, active: %s", server
, reason
, expire
, modtime
, flags
? "yes" : "no");
78 jupe
= make_jupe(server
, reason
, getnettime() + atoi(expire
),
79 atoi(modtime
), flags
);
84 Error("jupe", ERR_WARNING
, "jupe added for %s (%s) expiring in %s,"
85 " lastmod: %s, active: %s", server
, reason
, expire
, modtime
, flags
? "yes" : "no");
90 void sendjupeburst(int hook
, void *args
) {
93 if (hook
!= HOOK_IRC_SENDBURSTBURSTS
)
103 jupe_t
*make_jupe(char *server
, char *reason
, time_t expirets
, time_t lastmod
, unsigned int flags
) {
104 jupe_t
*jupe
, *last_jupe
;
106 jupe
= (jupe_t
*)malloc(sizeof(jupe_t
));
111 jupe
->ju_server
= getsstring(server
, HOSTLEN
);
112 jupe
->ju_reason
= getsstring(reason
, TOPICLEN
);
113 jupe
->ju_expire
= expirets
;
114 jupe
->ju_lastmod
= lastmod
;
115 jupe
->ju_flags
= flags
;
116 jupe
->ju_next
= NULL
;
118 /* add the jupe to our linked list */
124 while (last_jupe
->ju_next
)
125 last_jupe
= last_jupe
->ju_next
;
127 last_jupe
->ju_next
= jupe
;
133 void jupe_propagate(jupe_t
*jupe
) {
134 irc_send("%s JU * %c%s %d %d :%s", mynumeric
->content
,
135 JupeIsRemActive(jupe
) ? '+' : '-',
137 jupe
->ju_expire
- getnettime(),
142 void jupe_expire(void) {
146 jupe_t
*jupe_find(char *server
) {
147 jupe_t
*jupe
= jupes
;
150 /* server == NULL if jupe_find() is used by jupe_expire */
151 if (server
&& ircd_strcmp(server
, JupeServer(jupe
)) == 0)
154 if (jupe
->ju_next
&& jupe
->ju_next
->ju_expire
< getnettime())
155 jupe_free(jupe
->ju_next
);
157 jupe
= jupe
->ju_next
;
160 if (jupes
&& jupes
->ju_expire
< getnettime())
166 void jupe_free(jupe_t
*jupe
) {
167 jupe_t
*next
= jupe
->ju_next
;
168 jupe_t
*trav
= jupes
;
171 jupes
= jupe
->ju_next
;
174 if (trav
->ju_next
== jupe
) {
175 trav
->ju_next
= jupe
->ju_next
;
180 trav
= trav
->ju_next
;
184 freesstring(jupe
->ju_server
);
185 freesstring(jupe
->ju_reason
);
189 void jupe_activate(jupe_t
*jupe
) {
190 if (jupe
->ju_flags
& JUPE_ACTIVE
)
193 jupe
->ju_flags
|= JUPE_ACTIVE
;
194 jupe
->ju_lastmod
= getnettime();
196 jupe_propagate(jupe
);
199 void jupe_deactivate(jupe_t
*jupe
) {
200 if ((jupe
->ju_flags
& JUPE_ACTIVE
) == 0)
203 jupe
->ju_flags
&= ~JUPE_ACTIVE
;
204 jupe
->ju_lastmod
= getnettime();
206 jupe_propagate(jupe
);
209 int jupe_add(char *server
, char *reason
, time_t duration
, unsigned int flags
) {
212 if (jupe_find(server
) != NULL
)
215 if (duration
> JUPE_MAX_EXPIRE
|| duration
<= 0)
218 jupe
= make_jupe(server
, reason
, getnettime() + duration
,
219 getnettime(), flags
);
224 jupe_propagate(jupe
);