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

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

?? qmail-smtpd.c

?? linux下qmail的源碼 本人加了一些注釋
?? C
?? 第 1 頁 / 共 2 頁
字號:
  r = rcpthosts(addr.s,str_len(addr.s));  if (r == -1) die_control();  return r;}int seenmail = 0;int flagbarf; /* defined if seenmail */stralloc mailfrom = {0};stralloc rcptto = {0};void smtp_helo(arg) char *arg;{  smtp_greet("250 "); out("\r\n");  seenmail = 0; dohelo(arg);}void smtp_ehlo(arg) char *arg;{  smtp_greet("250-"); out("\r\n250-PIPELINING\r\n250 8BITMIME\r\n");  seenmail = 0; dohelo(arg);}

//重新初始化,調用helo或ehlo命令都會完成相同的功能void smtp_rset(){  seenmail = 0;  out("250 flushed\r\n");}

//mail命令解釋程序,重要變量:[mailfrom/全局]
//該函數完成檢查mailfrom是否在badmailfrom中定義,設置標志指明mail命令已經執行void smtp_mail(arg) char *arg;{  if (!addrparse(arg)) { err_syntax(); return; }

  //檢查是否badmailfrom,如果是設置相應標志,這個標志在rcpt命令的處理程序中才起作用  flagbarf = bmfcheck();  seenmail = 1;		//指示已經執行過mail命令。  if (!stralloc_copys(&rcptto,"")) die_nomem();		//分配rcptto緩沖區  if (!stralloc_copys(&mailfrom,addr.s)) die_nomem();	//復制mail命令中指定的地址到mailfrom  if (!stralloc_0(&mailfrom)) die_nomem();  out("250 ok\r\n");}

//rcpt命令解釋程序,重要變量:[rcptto/全局]void smtp_rcpt(arg) char *arg; {  if (!seenmail) { err_wantmail(); return; }	//買了命令是否已經執行?  if (!addrparse(arg)) { err_syntax(); return; }	//分離郵件地址參數存入全局緩存addr  
  //如果mail命令中的地址在control/badmailfrom中有定義,返回
  if (flagbarf) { err_bmf(); return; }
  //至此addr緩存中包含了rcpt命令指定的email地址
  //如果rcpt命令,則有addr="email@eg.org"。這個變量是在addrparse函數中賦值的
  //如果RELAYCLIENT環境變量設置將不進行rcpthosts,morercpthosts.cdb的比較
  //足以,大國smtp認證補丁,如果通過認證后會設置relayclient=""  if (relayclient) {    --addr.len;    if (!stralloc_cats(&addr,relayclient)) die_nomem();    if (!stralloc_0(&addr)) die_nomem();  }  else		//如果沒有指定RELAYCLIENT變量,則有control/rcpthosts決定是否進行轉發    if (!addrallowed()) { err_nogateway(); return; }

	//生成頭連接到全局緩存rcptto:
	//例如地址"rcpt test@eg.org"命令將產生rcptto="Temail@eg.org"
	//多次執行rcpt命令效果會是rcptto=“Ttest@eg.orgTtwo@eg.org”  if (!stralloc_cats(&rcptto,"T")) die_nomem();  if (!stralloc_cats(&rcptto,addr.s)) die_nomem();  if (!stralloc_0(&rcptto)) die_nomem();  out("250 ok\r\n");}
//saferead,從網絡讀len個字節到buf緩沖區
//返回實際讀到的字節數.
//超時值為control/timeoutsmtpd文件中指定的值.見setup()函數,(默認值1200秒)int saferead(fd,buf,len) int fd; char *buf; int len;{  int r;  flush();  r = timeoutread(timeout,fd,buf,len);  if (r == -1) if (errno == error_timeout) die_alarm();  if (r <= 0) die_read();  return r;}char ssinbuf[1024];substdio ssin = SUBSTDIO_FDBUF(saferead,0,ssinbuf,sizeof ssinbuf);struct qmail qqt;unsigned int bytestooverflow = 0;void put(ch)char *ch;{  if (bytestooverflow)    if (!--bytestooverflow)      qmail_fail(&qqt);  qmail_put(&qqt,ch,1);}void blast(hops)int *hops;{  char ch;  int state;  int flaginheader;  int pos; /* number of bytes since most recent \n, if fih */  int flagmaybex; /* 1 if this line might match RECEIVED, if fih */  int flagmaybey; /* 1 if this line might match \r\n, if fih */  int flagmaybez; /* 1 if this line might match DELIVERED, if fih */   state = 1;  *hops = 0;  flaginheader = 1;  pos = 0; flagmaybex = flagmaybey = flagmaybez = 1;  for (;;) {

	//從標準輸入(也就是網絡)讀郵件內容直到獨到僅有一個點的行.    substdio_get(&ssin,&ch,1);    if (flaginheader) {      if (pos < 9) {        if (ch != "delivered"[pos]) if (ch != "DELIVERED"[pos]) flagmaybez = 0;        if (flagmaybez) if (pos == 8) ++*hops;        if (pos < 8)          if (ch != "received"[pos]) if (ch != "RECEIVED"[pos]) flagmaybex = 0;        if (flagmaybex) if (pos == 7) ++*hops;        if (pos < 2) if (ch != "\r\n"[pos]) flagmaybey = 0;        if (flagmaybey) if (pos == 1) flaginheader = 0;      }      ++pos;      if (ch == '\n') { pos = 0; flagmaybex = flagmaybey = flagmaybez = 1; }    }    switch(state) {      case 0:        if (ch == '\n') straynewline();        if (ch == '\r') { state = 4; continue; }        break;      case 1: /* \r\n */        if (ch == '\n') straynewline();        if (ch == '.') { state = 2; continue; }        if (ch == '\r') { state = 4; continue; }        state = 0;        break;      case 2: /* \r\n + . */        if (ch == '\n') straynewline();        if (ch == '\r') { state = 3; continue; }        state = 0;        break;      case 3: /* \r\n + .\r */        if (ch == '\n') return;        put(".");        put("\r");        if (ch == '\r') { state = 4; continue; }        state = 0;        break;      case 4: /* + \r */        if (ch == '\n') { state = 1; break; }        if (ch != '\r') { put("\r"); state = 0; }    }    put(&ch);  }}char accept_buf[FMT_ULONG];void acceptmessage(qp) unsigned long qp;{  datetime_sec when;  when = now();  out("250 ok ");  accept_buf[fmt_ulong(accept_buf,(unsigned long) when)] = 0;  out(accept_buf);  out(" qp ");  accept_buf[fmt_ulong(accept_buf,qp)] = 0;  out(accept_buf);  out("\r\n");}
//data命令解釋程序
//完成向qmail-queue投遞郵件void smtp_data() {  int hops;  unsigned long qp;  char *qqx;   if (!seenmail) { err_wantmail(); return; }	//如果沒有執行過mail命令,出錯返回  if (!rcptto.len) { err_wantrcpt(); return; }	//如果沒有執行rcpt命令,出錯返回  seenmail = 0;		//將mail命令標志失效

  //databytes郵件最大長度,如果沒有指定那么值是0,代表無限  if (databytes) bytestooverflow = databytes + 1;  if (qmail_open(&qqt) == -1) { err_qqt(); return; }	//建立子進程執行qmail-queue  qp = qmail_qp(&qqt);		//qp為qmail-queue process縮寫,it's a process id。  out("354 go ahead\r\n"); 
  //向新建立的進程傳送郵件頭  received(&qqt,"SMTP",local,remoteip,remotehost,remoteinfo,fakehelo);  blast(&hops);  hops = (hops >= MAXHOPS);  if (hops) qmail_fail(&qqt);

  //向qmail-queue傳送郵件頭信息,如果hong@hg.org向lyx@hg.org發送郵件,那么向qmail-queue
  //傳送的字符串將是 Fhong@hg.orgTlyx@hg.org  qmail_from(&qqt,mailfrom.s);  qmail_put(&qqt,rcptto.s,rcptto.len);   qqx = qmail_close(&qqt);  if (!*qqx) { acceptmessage(qp); return; }		//如果接受成功  if (hops) { out("554 too many hops, this message is looping (#5.4.6)\r\n"); return; }  if (databytes) if (!bytestooverflow) { out("552 sorry, that message size exceeds my databytes limit (#5.3.4)\r\n"); return; }  if (*qqx == 'D') out("554 "); else out("451 ");  out(qqx + 1);  out("\r\n");}

//smtp命令處理函數表struct commands smtpcommands[] = {  { "rcpt", smtp_rcpt, 0 }, { "mail", smtp_mail, 0 }, { "data", smtp_data, flush }		//建立子進程執行qmail-queue,并向其傳送郵件., { "quit", smtp_quit, flush }, { "helo", smtp_helo, flush }, { "ehlo", smtp_ehlo, flush }, { "rset", smtp_rset, 0 }, { "help", smtp_help, flush }, { "noop", err_noop, flush }		//實際上未實現的命令, { "vrfy", err_vrfy, flush }		//實際上未實現的命令, { 0, err_unimpl, flush }			//命令錯誤} ;

/*
  qmail-smtpd 是由tcp-env程序啟動
  tcp-env將來自網絡的連接重定向到qmail-smtpd的標準輸入及標準輸出.
	這些程式建立一些環境變量(如TCPREMOTEHOST,TCPREMOTEIP)將由setup()函數使用
*/
void main(){  sig_pipeignore();		//忽略信號  if (chdir(auto_qmail) == -1) die_control();	//改變當前目錄到/var/qmail  setup();		//讀控制文件及相應的環境變量  if (ipme_init() != 1) die_ipme();		//取本地接口的ip地址  smtp_greet("220 ");		//顯示歡迎信息  out(" ESMTP\r\n");

  //從標準讀入(網絡連接)讀入smtp命令  if (commands(&ssin,&smtpcommands) == 0) die_read();  die_nomem();}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人av福利| 91精品国产全国免费观看| 蜜臀va亚洲va欧美va天堂| 亚洲女同女同女同女同女同69| 久久婷婷国产综合国色天香| 日韩欧美国产wwwww| 3atv在线一区二区三区| 欧美一区二区久久| 欧美mv日韩mv| 国产亚洲欧洲一区高清在线观看| 国产亚洲欧洲一区高清在线观看| 国产欧美一二三区| **性色生活片久久毛片| 亚洲一区二区三区四区在线| 亚洲国产日韩av| 日韩av在线播放中文字幕| 秋霞电影网一区二区| 狠狠色狠狠色综合| 成人av资源下载| 欧美在线免费播放| 日韩网站在线看片你懂的| 久久久亚洲高清| 久久综合九色综合欧美就去吻| 久久精品人人爽人人爽| 自拍偷拍欧美激情| 午夜久久电影网| 国产一区二区三区综合| 色综合天天综合给合国产| 欧美亚洲动漫精品| xfplay精品久久| 亚洲免费av高清| 蜜臀av性久久久久蜜臀aⅴ| 国产精品91xxx| 欧美色图第一页| www久久久久| 亚洲国产精品一区二区www| 久久激情五月激情| 91黄色小视频| 久久久久久久久久久久电影| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲电影第三页| 成人亚洲一区二区一| 欧美久久久久久蜜桃| 亚洲国产成人一区二区三区| 午夜视频在线观看一区二区三区| 国产高清不卡二三区| 9191成人精品久久| ...xxx性欧美| 丁香激情综合五月| 日韩精品一区二区三区在线| 中文字幕亚洲成人| 国产乱淫av一区二区三区| 欧美日韩免费电影| 亚洲色图制服诱惑| 成人午夜视频福利| 久久综合精品国产一区二区三区| 亚洲午夜免费视频| 欧美一区二区三区视频在线| 国产精品二三区| 国产精品99久久久久久有的能看| 欧美剧情片在线观看| 一区二区三区国产| 99久久婷婷国产综合精品电影| 日韩精品一区二区三区视频播放| 亚洲综合图片区| 色综合欧美在线视频区| 国产精品欧美一区喷水| 激情综合色综合久久| 日韩三级免费观看| 午夜精品久久久久| 在线一区二区观看| 亚洲私人黄色宅男| 色婷婷av一区二区三区大白胸| 国产精品入口麻豆原神| 成人小视频在线| 中文字幕制服丝袜成人av | 欧美日韩一区二区欧美激情| 国产精品久久三区| fc2成人免费人成在线观看播放| 久久久天堂av| 高清不卡一区二区| 中文字幕中文字幕在线一区| 99在线精品观看| 一区二区三区精品久久久| 日本黄色一区二区| 午夜精品久久久| 精品久久久久久亚洲综合网| 狠狠色丁香久久婷婷综| 国产蜜臀av在线一区二区三区| 成人国产电影网| 亚洲另类在线一区| 欧美日韩国产另类不卡| 欧美日韩在线播放三区四区| 午夜久久久久久| 久久奇米777| 99精品黄色片免费大全| 亚洲va欧美va国产va天堂影院| 欧美一区二区三区免费观看视频| 精品一区二区在线看| 国产精品久久夜| 欧美精品三级在线观看| 国内精品嫩模私拍在线| 综合精品久久久| 欧美一区二区三级| av亚洲精华国产精华| 天堂一区二区在线| 国产日本亚洲高清| 欧美亚一区二区| 国产乱色国产精品免费视频| 综合电影一区二区三区| 欧美xxxx在线观看| 色综合网色综合| 免费av网站大全久久| 国产精品情趣视频| 欧美日韩aaa| 成人免费看视频| 日韩专区中文字幕一区二区| 中文字幕av不卡| 日韩一区国产二区欧美三区| 暴力调教一区二区三区| 久久国产综合精品| 亚洲国产毛片aaaaa无费看 | 亚洲一级电影视频| 337p日本欧洲亚洲大胆精品| 色一情一乱一乱一91av| 国内成人免费视频| 婷婷一区二区三区| 最新日韩在线视频| 久久精品一区四区| 欧美一区永久视频免费观看| 91视频在线观看| 大胆亚洲人体视频| 久久国产精品72免费观看| 亚洲成人777| 亚洲天堂免费看| 中文一区在线播放| 国产日产欧产精品推荐色 | 盗摄精品av一区二区三区| 美女视频网站黄色亚洲| 亚洲国产精品久久不卡毛片| 中文字幕一区二区三区不卡在线 | 国产拍揄自揄精品视频麻豆| 日韩欧美国产精品一区| 欧美一区二区黄| 在线不卡中文字幕播放| 欧洲人成人精品| 欧美在线观看一二区| 色综合天天综合色综合av | 国产亚洲女人久久久久毛片| 日韩一区二区免费电影| 欧美精品在线观看播放| 欧美亚洲综合久久| 欧美在线高清视频| 欧美中文字幕一区| 欧美日韩激情在线| 欧美精品在线视频| 精品久久久久久亚洲综合网 | 国产福利一区二区三区视频在线 | 一区二区三区高清在线| 亚洲在线视频免费观看| 一区二区三区久久| 午夜激情久久久| 免费日本视频一区| 精品影视av免费| 成人精品一区二区三区四区| 成人精品电影在线观看| 99r精品视频| 欧美日韩大陆在线| 欧美一区二区精品| 亚洲国产精品成人综合| 中文字幕亚洲电影| 天天影视涩香欲综合网| 久久精品99国产精品日本| 国产成人综合在线播放| 99视频精品全部免费在线| 欧美在线高清视频| 精品国产91久久久久久久妲己| 久久久久97国产精华液好用吗| 亚洲欧洲精品天堂一级| 亚洲国产wwwccc36天堂| 狠狠色丁香久久婷婷综| 91免费观看视频在线| 欧美一二三区在线| 亚洲欧洲精品一区二区三区| 日本视频一区二区三区| 成人网在线播放| 欧美巨大另类极品videosbest | 亚洲男同性恋视频| 日本不卡的三区四区五区| 国产精品夜夜嗨| 精品视频在线免费看| 久久久夜色精品亚洲| 亚洲夂夂婷婷色拍ww47 | 欧美乱妇23p| 中文字幕av不卡| 麻豆精品新av中文字幕| 91免费版在线| 欧美经典一区二区三区| 亚洲v中文字幕| 99热这里都是精品|