]>
jfr.im git - irc/quakenet/newserv.git/blob - jupe/jupe.c
5 #include "../core/hooks.h"
6 #include "../lib/sstring.h"
7 #include "../server/server.h"
8 #include "../irc/irc.h"
9 #include "../core/error.h"
10 #include "../lib/irc_string.h"
15 int handlejupe(void *source
, int cargc
, char **cargv
);
18 /* If we're connected to IRC, force a disconnect. */
20 irc_send("%s SQ %s 0 :Resync [adding jupe support]", mynumeric
->content
, myserver
->content
);
24 registerserverhandler("JU", &handlejupe
, 5);
31 /* keep a pointer to the next item */
32 next
= jupes
->ju_next
;
39 deregisterserverhandler("JU", &handlejupe
);
42 int handlejupe(void *source
, int cargc
, char **cargv
) {
43 char *server
, *expire
, *modtime
, *reason
;
48 return CMD_OK
; /* local jupe or not a valid.. we don't care */
55 if (atoi(expire
) > JUPE_MAX_EXPIRE
|| atoi(expire
) <= 0)
56 return CMD_ERROR
; /* jupe's expiry date is not valid */
58 if (server
[0] != '+' && server
[0] != '-')
59 return CMD_OK
; /* not a valid jupe either */
61 flags
= (server
[0] == '+') ? JUPE_ACTIVE
: 0;
65 jupe
= jupe_find(server
);
67 if (jupe
!= NULL
&& atoi(modtime
) > jupe
->ju_lastmod
) {
68 jupe
->ju_flags
= flags
;
69 jupe
->ju_lastmod
= atoi(modtime
);
71 Error("jupe", ERR_INFO
, "jupe modified for %s (%s) expiring in %s,"
72 " lastmod: %s, active: %s", server
, reason
, expire
, modtime
, flags
? "yes" : "no");
76 jupe
= make_jupe(server
, reason
, getnettime() + atoi(expire
), atoi(modtime
), flags
);
81 Error("jupe", ERR_INFO
, "jupe added for %s (%s) expiring in %s,"
82 " lastmod: %s, active: %s", server
, reason
, expire
, modtime
, flags
? "yes" : "no");
87 jupe_t
*make_jupe(char *server
, char *reason
, time_t expirets
, time_t lastmod
, unsigned int flags
) {
90 jupe
= (jupe_t
*)malloc(sizeof(jupe_t
));
95 jupe
->ju_server
= getsstring(server
, HOSTLEN
);
96 jupe
->ju_reason
= getsstring(reason
, TOPICLEN
);
97 jupe
->ju_expire
= expirets
;
98 jupe
->ju_lastmod
= lastmod
;
99 jupe
->ju_flags
= flags
;
100 jupe
->ju_next
= NULL
;
102 /* add the jupe to our linked list */
103 jupe
->ju_next
= jupes
;
109 void jupe_propagate(jupe_t
*jupe
) {
110 irc_send("%s JU * %c%s %jd %jd :%s", mynumeric
->content
,
111 JupeIsRemActive(jupe
) ? '+' : '-',
113 (intmax_t)(jupe
->ju_expire
- getnettime()),
114 (intmax_t)JupeLastMod(jupe
),
118 void jupe_expire(void) {
122 jupe_t
*jupe_find(char *server
) {
123 jupe_t
*jupe
= jupes
;
126 /* server == NULL if jupe_find() is used by jupe_expire */
127 if (server
&& ircd_strcmp(server
, JupeServer(jupe
)) == 0)
130 if (jupe
->ju_next
&& jupe
->ju_next
->ju_expire
< getnettime())
131 jupe_free(jupe
->ju_next
);
133 jupe
= jupe
->ju_next
;
136 if (jupes
&& jupes
->ju_expire
< getnettime())
142 void jupe_free(jupe_t
*jupe
) {
143 jupe_t
*trav
= jupes
;
146 jupes
= jupe
->ju_next
;
149 if (trav
->ju_next
== jupe
) {
150 trav
->ju_next
= jupe
->ju_next
;
154 trav
= trav
->ju_next
;
158 freesstring(jupe
->ju_server
);
159 freesstring(jupe
->ju_reason
);
163 void jupe_activate(jupe_t
*jupe
) {
164 if (jupe
->ju_flags
& JUPE_ACTIVE
)
167 jupe
->ju_flags
|= JUPE_ACTIVE
;
168 jupe
->ju_lastmod
= getnettime();
170 jupe_propagate(jupe
);
173 void jupe_deactivate(jupe_t
*jupe
) {
174 if ((jupe
->ju_flags
& JUPE_ACTIVE
) == 0)
177 jupe
->ju_flags
&= ~JUPE_ACTIVE
;
178 jupe
->ju_lastmod
= getnettime();
180 jupe_propagate(jupe
);
183 int jupe_add(char *server
, char *reason
, time_t duration
, unsigned int flags
) {
186 if (jupe_find(server
) != NULL
)
189 if (duration
> JUPE_MAX_EXPIRE
|| duration
<= 0)
192 jupe
= make_jupe(server
, reason
, getnettime() + duration
, getnettime(), flags
);
197 jupe_propagate(jupe
);