?? tcpto.c
字號:
#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);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -