rb_event_add("throttle_expires", throttle_expires, NULL, 10);
}
+unsigned long
+throttle_size(void)
+{
+ unsigned long count;
+ rb_dlink_node *ptr;
+ rb_patricia_node_t *pnode;
+ throttle_t *t;
+
+ count = 0;
+ RB_DLINK_FOREACH(ptr, throttle_list.head)
+ {
+ pnode = ptr->data;
+ t = pnode->data;
+ if (t->count > ConfigFileEntry.throttle_count)
+ count++;
+ }
+
+ return count;
+}
void
add_reject(struct Client *client_p, const char *mask1, const char *mask2)
return 0;
}
+int
+is_reject_ip(struct sockaddr *addr)
+{
+ rb_patricia_node_t *pnode;
+ reject_t *rdata;
+ int duration;
+
+ /* Reject is disabled */
+ if(ConfigFileEntry.reject_after_count == 0 || ConfigFileEntry.reject_duration == 0)
+ return 0;
+
+ pnode = rb_match_ip(reject_tree, addr);
+ if(pnode != NULL)
+ {
+ rdata = pnode->data;
+
+ if(rdata->count > (unsigned long)ConfigFileEntry.reject_after_count)
+ {
+ duration = rdata->time + ConfigFileEntry.reject_duration - rb_current_time();
+ return duration > 0 ? duration : 1;
+ }
+ }
+ return 0;
+}
+
void
flush_reject(void)
{
t = pnode->data;
if(t->count > ConfigFileEntry.throttle_count)
- return 1;
-
+ {
+ ServerStats.is_thr++;
+ return 1;
+ }
/* Stop penalizing them after they've been throttled */
t->last = rb_current_time();
t->count++;
return 0;
}
+int
+is_throttle_ip(struct sockaddr *addr)
+{
+ throttle_t *t;
+ rb_patricia_node_t *pnode;
+ int duration;
+
+ if((pnode = rb_match_ip(throttle_tree, addr)) != NULL)
+ {
+ t = pnode->data;
+ if(t->count > ConfigFileEntry.throttle_count)
+ {
+ duration = t->last + ConfigFileEntry.throttle_duration - rb_current_time();
+ return duration > 0 ? duration : 1;
+ }
+ }
+ return 0;
+}
+
+void
+flush_throttle(void)
+{
+ rb_dlink_node *ptr, *next;
+ rb_patricia_node_t *pnode;
+ throttle_t *t;
+
+ RB_DLINK_FOREACH_SAFE(ptr, next, throttle_list.head)
+ {
+ pnode = ptr->data;
+ t = pnode->data;
+
+ rb_dlinkDelete(ptr, &throttle_list);
+ rb_free(t);
+ rb_patricia_remove(throttle_tree, pnode);
+ }
+}
+
static void
throttle_expires(void *unused)
{