⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpto.c

📁 linux下qmail的源码 本人加了一些注释
💻 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 + -