diff options
Diffstat (limited to 'src/cache/shibari-cache.c')
-rw-r--r-- | src/cache/shibari-cache.c | 65 |
1 files changed, 33 insertions, 32 deletions
diff --git a/src/cache/shibari-cache.c b/src/cache/shibari-cache.c index ea705bd..d9391f2 100644 --- a/src/cache/shibari-cache.c +++ b/src/cache/shibari-cache.c @@ -197,6 +197,8 @@ int main (int argc, char const *const *argv) memset(udpq4, 0, n4 * sizeof(udpqueue)) ; memset(udpq6, 0, n6 * sizeof(udpqueue)) ; + g->udpqueues[0] = udpq4 ; + g->udpqueues[1] = udpq6 ; memset(tcpconnection_storage, 0, (maxtcp + 1) * sizeof(tcpconnection)) ; memset(query_storage, 0, (maxqueries + 1) * sizeof(query)) ; GENSET_init(&g->tcpconnections, tcpconnection, tcpconnection_storage, tcpconnection_freelist, maxtcp + 1) ; @@ -391,10 +393,11 @@ int main (int argc, char const *const *argv) else { - for (uint16_t i = 0 ; i < j ; i++) if (x[i].revents & IOPAUSE_EXCEPT) x[i].revents |= x[i].events ; - if (x[0].revents & IOPAUSE_READ) { handle_signals() ; continue ; } + + /* write udp */ + for (uint16_t i = 0 ; i < n4 ; i++) if (udpq4[i].xindex < UINT16_MAX) { if (x[udpq4[i].xindex].revents & IOPAUSE_WRITE) @@ -423,6 +426,9 @@ int main (int argc, char const *const *argv) } #endif + + /* write tcp */ + for (uint16_t i = tcpstart ; i != g->tcpsentinel ; i = TCPCONNECTION(i)->next) { tcpconnection *p = TCPCONNECTION(i) ; @@ -430,6 +436,9 @@ int main (int argc, char const *const *argv) if (tcpconnection_flush(p) == -1) i = tcpconnection_delete(p) ; } + + /* process in-flight queries */ + for (uint16_t i = qstart ; i != g->qsentinel ; i = QUERY(i)->next) { if (QUERY(i)->xindex == UINT16_MAX) continue ; @@ -438,6 +447,9 @@ int main (int argc, char const *const *argv) else if (r > 0) i = query_succeed(i) ; } + + /* read udp */ + for (uint16_t i = 0 ; i < n4 ; i++) { if (udpq4[i].xindex < UINT16_MAX && x[udpq4[i].xindex].revents & IOPAUSE_READ) @@ -456,18 +468,11 @@ int main (int argc, char const *const *argv) strerr_diefu2sys(111, "read from UDP socket bound to ", fmt) ; } if (!len) break ; - if (len < 12 || len > 512) continue ; - if (!clientaccess_ip4(ip)) continue ; - if (!dns_newquery(0, i, ip, port, buf, len)) + if (len < 12 || len > 512 + || !clientaccess_ip4(ip) + || !query_start(0, i, ip, port, buf, len)) { - if (g->verbosity) - { - char fmtip[IP4_FMT] ; - char fmtport[UINT16_FMT] ; - fmtip[ip4_fmt(fmtip, ip)] = 0 ; - fmtport[uint16_fmt(fmtport, port)] = 0 ; - strerr_warnwu4sys("process new UDP query from ip ", fmtip, " port ", fmtport) ; - } + if (g->verbosity >= 3) log_udpbad(ip, port) ; } } } @@ -492,24 +497,20 @@ int main (int argc, char const *const *argv) strerr_diefu2sys(111, "read from UDP socket bound to ", fmt) ; } if (!len) break ; - if (len < 12 || len > 512) continue ; - if (!clientaccess_ip6(ip)) continue ; - if (!dns_newquery(1, i, ip, port, buf, len)) + if (len < 12 || len > 512 + || !clientaccess_ip6(ip) + || !query_start(1, i, ip, port, buf, len)) { - if (g->verbosity) - { - char fmtip[IP4_FMT] ; - char fmtport[UINT16_FMT] ; - fmtip[ip4_fmt(fmtip, ip)] = 0 ; - fmtport[uint16_fmt(fmtport, port)] = 0 ; - strerr_warnwu4sys("process new UDP query from ip ", fmtip, " port ", fmtport) ; - } + if (g->verbosity >= 3) log_udpbad(ip, port) ; } } } } #endif + + /* read tcp */ + for (uint16_t i = tcpstart ; i != g->tcpsentinel ; i = TCPCONNECTION(i)->next) { tcpconnection *p = TCPCONNECTION(i) ; @@ -521,21 +522,21 @@ int main (int argc, char const *const *argv) int l = sanitize_read(mininetstring_read(bufalloc_fd(&p->out), &p->in, &p->instate)) ; if (l == -1) { i = tcpconnection_delete(p) ; break ; } if (!l) break ; - if (p->in.len < 12 || p->in.len > 65536) { i = tcpconnection_delete(p) ; break ; } - if (!dns_newquery(2, i, 0, 0, p->in.s, p->in.len)) + if (p->in.len < 12 || p->in.len > 65536 + || !query_start(2, i, 0, 0, p->in.s, p->in.len)) { - if (g->verbosity) - { - char fmt[UINT16_FMT] ; - fmt[uint16_fmt(fmt, i)] = 0 ; - strerr_warnwu2sys("process TCP query on connection ", fmt) ; - } + if (g->verbosity >= 3) log_tcpbad(i) ; + i = tcpconnection_delete(p) ; + break ; } p->in.len = 0 ; } } } + + /* new tcp */ + for (uint16_t i = 0 ; i < n4 ; i++) if (tcp4xindex[i] < UINT16_MAX) { if (x[tcp4xindex[i]].revents & IOPAUSE_READ) |