#include "tcpto.h" #include "open.h" #include "lock.h" #include "seek.h" #include "now.h" #include "ip.h" #include "byte.h" #include "datetime.h" #include "readwrite.h" char tcpto_buf[1024]; static int flagwasthere; static int fdlock; static int getbuf() { int r; int fd; fdlock = open_write("queue/lock/tcpto"); if (fdlock == -1) return 0; fd = open_read("queue/lock/tcpto"); if (fd == -1) { close(fdlock); return 0; } if (lock_ex(fdlock) == -1) { close(fdlock); close(fd); return 0; } r = read(fd,tcpto_buf,sizeof(tcpto_buf)); close(fd); if (r < 0) { close(fdlock); return 0; } r >>= 4; if (!r) close(fdlock); return r; } int tcpto(ip) struct ip_address *ip; { int n; int i; char *record; datetime_sec when; flagwasthere = 0; n = getbuf(); if (!n) return 0; close(fdlock); record = tcpto_buf; for (i = 0;i < n;++i) { if (byte_equal(ip->d,4,record)) { flagwasthere = 1; if (record[4] >= 2) { when = (unsigned long) (unsigned char) record[11]; when = (when << 8) + (unsigned long) (unsigned char) record[10]; when = (when << 8) + (unsigned long) (unsigned char) record[9]; when = (when << 8) + (unsigned long) (unsigned char) record[8]; if (now() - when < ((60 + (getpid() & 31)) << 6)) return 1; } return 0; } record += 16; } return 0; } void tcpto_err(ip,flagerr) struct ip_address *ip; int flagerr; { int n; int i; char *record; datetime_sec when; datetime_sec firstwhen; int firstpos; datetime_sec lastwhen; if (!flagerr) if (!flagwasthere) return; /* could have been added, but not worth the effort to check */ n = getbuf(); if (!n) return; record = tcpto_buf; for (i = 0;i < n;++i) { if (byte_equal(ip->d,4,record)) { if (!flagerr) record[4] = 0; else { lastwhen = (unsigned long) (unsigned char) record[11]; lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[10]; lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[9]; lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[8]; when = now(); if (record[4] && (when < 120 + lastwhen)) { close(fdlock); return; } if (++record[4] > 10) record[4] = 10; record[8] = when; when >>= 8; record[9] = when; when >>= 8; record[10] = when; when >>= 8; record[11] = when; } if (seek_set(fdlock,i << 4) == 0) if (write(fdlock,record,16) < 16) ; /*XXX*/ close(fdlock); return; } record += 16; } if (!flagerr) { close(fdlock); return; } record = tcpto_buf; for (i = 0;i < n;++i) { if (!record[4]) break; record += 16; } if (i >= n) { firstpos = -1; record = tcpto_buf; for (i = 0;i < n;++i) { when = (unsigned long) (unsigned char) record[11]; when = (when << 8) + (unsigned long) (unsigned char) record[10]; when = (when << 8) + (unsigned long) (unsigned char) record[9]; when = (when << 8) + (unsigned long) (unsigned char) record[8]; when += (record[4] << 10); if ((firstpos < 0) || (when < firstwhen)) { firstpos = i; firstwhen = when; } record += 16; } i = firstpos; } if (i >= 0) { record = tcpto_buf + (i << 4); byte_copy(record,4,ip->d); when = now(); record[8] = when; when >>= 8; record[9] = when; when >>= 8; record[10] = when; when >>= 8; record[11] = when; record[4] = 1; if (seek_set(fdlock,i << 4) == 0) if (write(fdlock,record,16) < 16) ; /*XXX*/ } close(fdlock); }