亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? qmail-smtpd.c

?? linux下qmail的源碼 本人加了一些注釋
?? C
?? 第 1 頁 / 共 2 頁
字號:
//	qmail-smtpd接受遠程主機的郵件并轉交給隊列處理程序qmail-queue來處理
//	由tcp-env.c啟動,完成郵件smtp命令的接收,并調用相應的處理程序
//	只接收郵件內容(mailfrom,mailto)并傳送給qmail-queue,并不對郵件進行轉發

#include "sig.h"#include "readwrite.h"#include "stralloc.h"#include "substdio.h"#include "alloc.h"#include "auto_qmail.h"#include "control.h"#include "received.h"#include "constmap.h"#include "error.h"#include "ipme.h"#include "ip.h"#include "qmail.h"#include "str.h"#include "fmt.h"#include "scan.h"#include "byte.h"#include "case.h"#include "env.h"#include "now.h"#include "exit.h"#include "rcpthosts.h"#include "timeoutread.h"#include "timeoutwrite.h"#include "commands.h"#define MAXHOPS 100unsigned int databytes = 0;		//郵件最大長度:0=無限int timeout = 1200;		//默認超時20分鐘
//	向網絡寫,超時值為control/timeoutsmtpd指定的值,沒有這個文件則取默認值20分鐘int safewrite(fd,buf,len) int fd; char *buf; int len;{  int r;  r = timeoutwrite(timeout,fd,buf,len);  if (r <= 0) _exit(1);  return r;}char ssoutbuf[512];substdio ssout = SUBSTDIO_FDBUF(safewrite,1,ssoutbuf,sizeof ssoutbuf);void flush() { substdio_flush(&ssout); }

//	void out(s) char *s 相當于 void out(char* s)void out(s) char *s; { substdio_puts(&ssout,s); }
//	錯誤處理函數void die_read() { _exit(1); }void die_alarm() { out("451 timeout (#4.4.2)\r\n"); flush(); _exit(1); }void die_nomem() { out("421 out of memory (#4.3.0)\r\n"); flush(); _exit(1); }void die_control() { out("421 unable to read controls (#4.3.0)\r\n"); flush(); _exit(1); }void die_ipme() { out("421 unable to figure out my IP addresses (#4.3.0)\r\n"); flush(); _exit(1); }void straynewline() { out("451 See http://pobox.com/~djb/docs/smtplf.html.\r\n"); flush(); _exit(1); }void err_bmf() { out("553 sorry, your envelope sender is in my badmailfrom list (#5.7.1)\r\n"); }void err_nogateway() { out("553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)\r\n"); }void err_unimpl() { out("502 unimplemented (#5.5.1)\r\n"); }void err_syntax() { out("555 syntax error (#5.5.4)\r\n"); }void err_wantmail() { out("503 MAIL first (#5.5.1)\r\n"); }void err_wantrcpt() { out("503 RCPT first (#5.5.1)\r\n"); }void err_noop() { out("250 ok\r\n"); }void err_vrfy() { out("252 send some mail, i'll try my best\r\n"); }void err_qqt() { out("451 qqt failure (#4.3.0)\r\n"); }stralloc greeting = {0};//end 錯誤處理函數
//	輸出提示信息*codevoid smtp_greet(code) char *code;{  substdio_puts(&ssout,code);  substdio_put(&ssout,greeting.s,greeting.len);}void smtp_help(){  out("214 qmail home page: http://pobox.com/~djb/qmail.html\r\n");}void smtp_quit(){  smtp_greet("221 "); out("\r\n"); flush(); _exit(0);}char *remoteip;	//遠端ip地址char *remotehost;	//遠端主機名char *remoteinfo;	//遠端信息char *local;	//本地主機char *relayclient;	//是否檢查rcpthosts文件stralloc helohost = {0};char *fakehelo; /* pointer into helohost, or 0 */void dohelo(arg) char *arg; {  if (!stralloc_copys(&helohost,arg)) die_nomem();   if (!stralloc_0(&helohost)) die_nomem(); 

  //fakehelo變量,如果helo參數指定的主機名與TCPREMOTEHOST環境變量中的主機名不同則
  //fakehelo的值為helo命令的參數指定的主機名。如果兩者相同則fekehelo為NULL;
  //data命令處理程式用到這個變量  fakehelo = case_diffs(remotehost,helohost.s) ? helohost.s : 0;}int liphostok = 0;stralloc liphost = {0};int bmfok = 0;

//	badmailfrom 用來指定不喜歡的發見人的郵件地址或者是域名
//該地址給主機發送郵件時將得到code 553,告知其是不受歡迎的發件人stralloc bmf = {0};		struct constmap mapbmf;void setup(){  char *x;  unsigned long u;   if (control_init() == -1) die_control();	//control/me

  //讀入歡迎信息greeting,如果不存在則從me文件復制  if (control_rldef(&greeting,"control/smtpgreeting",1,(char *) 0) != 1)    die_control();

  //讀入localiphost,如果文件不存在則從me文件復制  liphostok = control_rldef(&liphost,"control/localiphost",1,(char *) 0);  if (liphostok == -1) die_control();

  //讀control/timeoutsmtpd存入timeout,用于控制超時的情況  if (control_readint(&timeout,"control/timeoutsmtpd") == -1) die_control();  if (timeout <= 0) timeout = 1;  if (rcpthosts_init() == -1) die_control();
  //讀入badmailfrom文件存入bmf  bmfok = control_readfile(&bmf,"control/badmailfrom",0);  if (bmfok == -1) die_control();  if (bmfok)    if (!constmap_init(&mapbmf,bmf.s,bmf.len,0)) die_nomem(); 
  //讀入databytes文件存入databytes,如果該文件不存在,則將databytes的值設為0.  if (control_readint(&databytes,"control/databytes") == -1) die_control();  x = env_get("DATABYTES");  if (x) { scan_ulong(x,&u); databytes = u; }  if (!(databytes + 1)) --databytes; 
  //取tcp-environ環境變量,如果環境變量沒有設置,將它的值設置為unknow
  //這些信息在tcp-env文件中  remoteip = env_get("TCPREMOTEIP");  if (!remoteip) remoteip = "unknown";  local = env_get("TCPLOCALHOST");  if (!local) local = env_get("TCPLOCALIP");  if (!local) local = "unknown";  remotehost = env_get("TCPREMOTEHOST");  if (!remotehost) remotehost = "unknown";  remoteinfo = env_get("TCPREMOTEINFO");

  //從環境變量RELAYCLIENT讀入,如果RELAYCLIENT變量沒有設置那么relayclient將會是NULL  relayclient = env_get("RELAYCLIENT");  dohelo(remotehost);}stralloc addr = {0}; /* will be 0-terminated, if addrparse returns 1 */
//對命令參數arg進行郵件地址分析,并將分離出的email地址存入全局緩存addr,成功返回值1,
//失敗返回0int addrparse(arg)char *arg;{  int i;  char ch;  char terminator;  struct ip_address ip;  int flagesc;  int flagquoted; 
  //分離出郵件地址,例如:arg="",或arg=": email@eg.org"
  //執行下面這段程序后arg="email@eg.org"  terminator = '>';  i = str_chr(arg,'<');  if (arg[i])    arg += i + 1;  else { /* partner should go read rfc 821 */    terminator = ' ';    arg += str_chr(arg,':');    if (*arg == ':') ++arg;    while (*arg == ' ') ++arg;  }  /* strip source route */  if (*arg == '@') while (*arg) if (*arg++ == ':') break;  if (!stralloc_copys(&addr,"")) die_nomem();  flagesc = 0;  flagquoted = 0;  for (i = 0;ch = arg[i];++i) { /* copy arg to addr, stripping quotes */    if (flagesc) {      if (!stralloc_append(&addr,&ch)) die_nomem();      flagesc = 0;    }    else {      if (!flagquoted && (ch == terminator)) break;      switch(ch) {        case '\\': flagesc = 1; break;        case '"': flagquoted = !flagquoted; break;        default: if (!stralloc_append(&addr,&ch)) die_nomem();      }    }  }  /* could check for termination failure here, but why bother? */  if (!stralloc_append(&addr,"")) die_nomem();
  //將ip地址轉換為主機名:
  //如test@[10.0.6.21]轉換為test@host.mydomain.org
  //依據是control/localiphost文件中有host.mydomain.org  if (liphostok) {    i = byte_rchr(addr.s,addr.len,'@');    if (i < addr.len) /* if not, partner should go read rfc 821 */      if (addr.s[i + 1] == '[')		//比較是否是用[]括起來的ip地址        if (!addr.s[i + 1 + ip_scanbracket(addr.s + i + 1,&ip)])          if (ipme_is(&ip)) {            addr.len = i + 1;            if (!stralloc_cat(&addr,&liphost)) die_nomem();            if (!stralloc_0(&addr)) die_nomem();          }  }  if (addr.len > 900) return 0;		//地址太長,出錯返回  return 1;		//成功返回}
//簡單的垃圾郵件檢查,檢查全局緩沖區addr中的地址是否有在badmailfrom中定義,如果
//有則返回1,否則返回0.int bmfcheck(){  int j;  if (!bmfok) return 0;  if (constmap(&mapbmf,addr.s,addr.len - 1)) return 1;  j = byte_rchr(addr.s,addr.len,'@');  if (j < addr.len)    if (constmap(&mapbmf,addr.s + j,addr.len - j - 1)) return 1;  return 0;}
//檢查全局緩存addr中的郵件地址是否要進行轉發(依據control/rcpthosts文件)
//可以進行轉發返回1,拒絕轉發返回0int addrallowed(){  int r;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
毛片av一区二区三区| 成人毛片视频在线观看| 亚洲婷婷综合久久一本伊一区| 在线看一区二区| 国产乱一区二区| 天天色天天爱天天射综合| 国产精品久久国产精麻豆99网站| 欧美一区二区三区四区久久| 一本大道久久a久久精品综合| 国产麻豆一精品一av一免费| 青青草原综合久久大伊人精品 | 成人精品在线视频观看| 日本不卡免费在线视频| 亚洲国产日日夜夜| 亚洲欧美日韩中文播放 | 国产精品青草综合久久久久99| 欧美一区二区三区色| 欧美亚洲愉拍一区二区| 不卡一区在线观看| 国产成人精品亚洲777人妖| 日韩国产欧美一区二区三区| 亚洲激情第一区| 综合久久国产九一剧情麻豆| 国产精品人成在线观看免费| 久久亚洲精精品中文字幕早川悠里| 欧美精品久久99久久在免费线 | 久久久久免费观看| 精品久久免费看| 日韩美女一区二区三区| 日韩写真欧美这视频| 91精品免费在线| 欧美卡1卡2卡| 9191国产精品| 91精品在线一区二区| 制服丝袜日韩国产| 欧美精品xxxxbbbb| 欧美高清www午色夜在线视频| 欧美蜜桃一区二区三区| 欧美老年两性高潮| 正在播放亚洲一区| 欧美一区二区啪啪| 日韩欧美视频一区| 亚洲精品一区二区三区四区高清| 精品乱码亚洲一区二区不卡| 精品不卡在线视频| 久久精品人人做| 欧美激情综合五月色丁香| 国产欧美在线观看一区| 亚洲视频免费在线| 一区二区三区四区中文字幕| 亚洲地区一二三色| 日产国产高清一区二区三区| 国产最新精品精品你懂的| 国产一区久久久| 国产91在线看| 91蝌蚪国产九色| 欧美色图第一页| 日韩一区二区免费在线观看| 久久综合久久99| 亚洲欧洲精品成人久久奇米网| 亚洲老司机在线| 五月激情丁香一区二区三区| 久久精品国产99| 成人蜜臀av电影| 欧美日韩成人综合在线一区二区| 欧美一区欧美二区| 久久久青草青青国产亚洲免观| 国产精品高潮呻吟| 亚洲va在线va天堂| 国产精品亚洲专一区二区三区 | 一本大道久久a久久精二百| 欧美日韩三级一区| 亚洲精品一线二线三线| 亚洲精品中文在线影院| 蜜臀va亚洲va欧美va天堂| 国产成人在线视频免费播放| 色综合亚洲欧洲| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲欧洲三级电影| 久久99日本精品| 色婷婷综合五月| 精品国产一区久久| 亚洲乱码日产精品bd| 喷白浆一区二区| 91亚洲精华国产精华精华液| 日韩欧美不卡一区| 亚洲欧美日韩在线| 激情深爱一区二区| 欧美在线免费视屏| 国产精品三级电影| 麻豆精品视频在线观看视频| 色伊人久久综合中文字幕| 日韩精品自拍偷拍| 亚洲一区二区3| 高清beeg欧美| 欧美大胆人体bbbb| 亚洲专区一二三| 福利一区福利二区| 日韩精品一区二区三区三区免费| 亚洲欧美一区二区三区孕妇| 国产东北露脸精品视频| 91精品国产综合久久福利 | 亚洲成年人影院| 成人少妇影院yyyy| 欧美成人一区二区三区| 亚洲午夜视频在线观看| www.亚洲色图.com| 久久精品一区四区| 激情亚洲综合在线| 日韩欧美国产高清| 日本成人在线看| 欧美亚洲一区三区| 自拍偷拍亚洲欧美日韩| 国产成人精品免费看| 欧美va亚洲va在线观看蝴蝶网| 午夜伦欧美伦电影理论片| 在线观看日韩电影| 亚洲蜜桃精久久久久久久| 成人免费看片app下载| 国产日韩精品久久久| 黄页视频在线91| 精品久久国产字幕高潮| 免费的国产精品| 91精品国产综合久久精品性色| 亚洲第一激情av| 欧美日韩中文字幕精品| 亚洲地区一二三色| 欧美高清你懂得| 日本亚洲三级在线| 欧美一级淫片007| 日日摸夜夜添夜夜添精品视频 | 国产不卡在线视频| 国产人伦精品一区二区| 极品瑜伽女神91| 精品不卡在线视频| 国产精品乡下勾搭老头1| 国产日韩一级二级三级| 成人少妇影院yyyy| 亚洲免费观看视频| 欧美亚洲综合在线| 日本在线不卡视频一二三区| 日韩欧美中文字幕一区| 麻豆91免费观看| 26uuu国产电影一区二区| 国产精品1区二区.| 中文字幕一区二区在线观看| 91美女在线视频| 亚洲午夜在线观看视频在线| 欧美日本乱大交xxxxx| 日韩高清不卡在线| 亚洲精品在线电影| 成人激情动漫在线观看| 中文字幕亚洲视频| 欧美在线观看禁18| 日本成人在线不卡视频| 精品国产乱码久久久久久闺蜜 | 99精品热视频| 亚洲最大色网站| 91精品国产综合久久久久久久 | 久久久精品tv| 91在线免费看| 日日欢夜夜爽一区| 国产亚洲婷婷免费| 色妹子一区二区| 日韩精品一级中文字幕精品视频免费观看 | 久久综合久久99| 色综合视频在线观看| 天堂va蜜桃一区二区三区| 精品播放一区二区| 91麻豆免费观看| 伦理电影国产精品| 最新热久久免费视频| 欧美性生活大片视频| 久久99精品国产.久久久久久| 国产精品免费视频观看| 欧美另类变人与禽xxxxx| 国产黄人亚洲片| 亚洲v中文字幕| 亚洲国产精品精华液2区45| 欧美性猛片xxxx免费看久爱 | 在线视频观看一区| 国产在线精品一区二区| 亚洲在线中文字幕| 国产三级精品三级在线专区| 欧美美女黄视频| 成人国产电影网| 美女诱惑一区二区| 亚洲黄色录像片| 国产日产欧美一区二区三区| 7777精品伊人久久久大香线蕉经典版下载 | 91精品国产日韩91久久久久久| 成人三级伦理片| 久久精品国产亚洲aⅴ| 亚洲黄色录像片| 国产精品电影院| 国产午夜精品久久久久久久| 91精品国产综合久久久久久久 | 久久久www成人免费无遮挡大片| 欧美午夜精品一区二区蜜桃 | 国产精品69毛片高清亚洲|