X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/fa14012da55d8fa4b8d79b164ada9c354aeefbc9..440cd7e63ac2b059ea1a467a2e4e2244faf92cb3:/proxyscan/proxyscanqueue.c diff --git a/proxyscan/proxyscanqueue.c b/proxyscan/proxyscanqueue.c index e37ae751..fae99c5e 100644 --- a/proxyscan/proxyscanqueue.c +++ b/proxyscan/proxyscanqueue.c @@ -6,6 +6,7 @@ #include "proxyscan.h" #include "../irc/irc.h" #include "../core/error.h" +#include pendingscan *ps_normalqueue=NULL; pendingscan *ps_prioqueue=NULL; @@ -19,42 +20,27 @@ unsigned long countpendingscan=0; void queuescan(patricia_node_t *node, short scantype, unsigned short port, char class, time_t when) { pendingscan *psp, *psp2; - /* check if the IP/port combo is already queued - don't queue up - * multiple identical scans + /* we can just blindly queue the scans as node extension cleanhost cache blocks duplicate scans normally. + * Scans may come from: + * a) scan (from an oper) + * b) newnick handler - which ignores clean hosts, only scans new hosts or dirty hosts + * c) adding a new scan type (rare) */ - psp = ps_prioqueue; - while (psp != NULL) - { - if (psp->node == node && psp->type == scantype && - psp->port == port && psp->class == class) - { - /* found it, ignore */ - return; - } - psp = psp->next; - } - psp = ps_normalqueue; - while (psp != NULL) - { - if (psp->node == node && psp->type == scantype && - psp->port == port && psp->class == class) - { - /* found it, ignore */ - return; - } - psp = psp->next; - } + /* we should never have an internal node */ + assert(node->prefix); + /* reference the node - we either start a or queue a single scan */ + patricia_ref_prefix(node->prefix); /* If there are scans spare, just start it immediately.. * provided we're not supposed to wait */ - if (activescans < maxscans && when<=time(NULL) && (ps_start_ts+120 <= time(NULL))) { + if (activescans < maxscans && when<=time(NULL) && ps_ready) { startscan(node, scantype, port, class); return; } /* We have to queue it */ - if (!(psp=(struct pendingscan *)malloc(sizeof(pendingscan)))) + if (!(psp=getpendingscan())) Error("proxyscan",ERR_STOP,"Unable to allocate memory"); countpendingscan++; @@ -95,9 +81,6 @@ void queuescan(patricia_node_t *node, short scantype, unsigned short port, char void startqueuedscans() { pendingscan *psp=NULL; - if (ps_start_ts+120 > time(NULL)) - return; - while (activescans < maxscans) { if (ps_prioqueue && (ps_prioqueue->when <= time(NULL))) { psp=ps_prioqueue; @@ -113,7 +96,7 @@ void startqueuedscans() { if (psp) { startscan(psp->node, psp->type, psp->port, psp->class); - free(psp); + freependingscan(psp); countpendingscan--; psp=NULL; } else {