X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/76d4968137b7421cadd063eb3f59134be09cb3fc..9d393c9052eed3ccdc83f6b9fe75fd7d258ced57:/src/reject.c diff --git a/src/reject.c b/src/reject.c index f6d4b3d..3453c7d 100644 --- a/src/reject.c +++ b/src/reject.c @@ -125,7 +125,21 @@ init_reject(void) unsigned long throttle_size(void) { - return rb_dlink_list_length(&throttle_list); + 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 @@ -197,6 +211,31 @@ check_reject(rb_fde_t *F, struct sockaddr *addr) 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) { @@ -298,6 +337,43 @@ throttle_add(struct sockaddr *addr) 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) {