#include "proxyscan.h"
#include "../irc/irc.h"
+#include "../core/error.h"
pendingscan *ps_normalqueue=NULL;
pendingscan *ps_prioqueue=NULL;
unsigned long countpendingscan=0;
-void queuescan(unsigned int IP, short scantype, unsigned short port, char class, time_t when) {
+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 <node> (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->IP == IP && psp->type == scantype &&
- psp->port == port && psp->class == class)
- {
- /* found it, ignore */
- return;
- }
- psp = psp->next;
- }
-
- psp = ps_normalqueue;
- while (psp != NULL)
- {
- if (psp->IP == IP && psp->type == scantype &&
- psp->port == port && psp->class == class)
- {
- /* found it, ignore */
- return;
- }
- psp = psp->next;
- }
/* 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))) {
- startscan(IP, scantype, port, class);
+ if (activescans < maxscans && when<=time(NULL) && ps_ready) {
+ startscan(node, scantype, port, class);
return;
}
/* We have to queue it */
- psp = (struct pendingscan *) malloc(sizeof(pendingscan));
- if (!psp)
- {
- /* shutdown due to no memory */
- irc_send("%s SQ %s 0 :Out of memory - exiting.",mynumeric->content,myserver->content);
- irc_disconnected();
- exit(0);
- } else {
- countpendingscan++;
- }
- psp->IP=IP;
+ if (!(psp=getpendingscan()))
+ Error("proxyscan",ERR_STOP,"Unable to allocate memory");
+
+ countpendingscan++;
+
+ psp->node=node;
psp->type=scantype;
psp->port=port;
psp->class=class;
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;
}
if (psp) {
- startscan(psp->IP, psp->type, psp->port, psp->class);
- free(psp);
+ startscan(psp->node, psp->type, psp->port, psp->class);
+ freependingscan(psp);
countpendingscan--;
psp=NULL;
} else {