Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->Linux程序设计 ->正文

程序员眼中的qmail(qmail源代码分析)

来源:5dmail.net 作者:未知  时间:2007-04-22 点击: [收藏] [投稿]

  int i;

  unsigned long limit;

  int fd;

  i = msgno(arg);//邮件号

  if (i == -1) return;

  arg += scan_ulong(arg,&limit);//显示几行,如果未指定那么limit为0(balst函数打印全部内容)

  while (*arg == ' ') ++arg;

  if (scan_ulong(arg,&limit)) ++limit; else limit = 0;

  fd = open_read(m[i].fn);

  if (fd == -1) { err_nosuch(); return; }

  okay();

  //关系ssmsg为从指定的消息文件中读

  substdio_fdbuf(&ssmsg,read,fd,ssmsgbuf,sizeof(ssmsgbuf));

  //从ssmsg中读到fd1,如果limit大于0将只读取除消息头外的limit行,如果等于0读全部邮件

  blast(&ssmsg,limit);

  close(fd);

  }

  struct commands pop3commands[] = { //pop3命令及处理函数表

  { "quit", pop3_quit, 0 }

  , { "stat", pop3_stat, 0 }

  , { "list", pop3_list, 0 }//显示消息大小, { "uidl", pop3_uidl, 0 }//显示消息文件名, { "dele", pop3_dele, 0 }

  , { "retr", pop3_top, 0 }//取一条消息的内容,与top实现是一样的, { "rset", pop3_rset, 0 }//重置pop对话,清除所有删除标记, { "last", pop3_last, 0 }

  , { "top", pop3_top, 0 }

  , { "noop", okay, 0 }

  , { 0, err_unimpl, 0 }

  } ;

  /*qmail-pop3d由vchkpw或checkpassword之类的程式起动,只有认证通过后才能

  执行本程式提供各种pop3命令

  */

  void main(argc,argv)

  int argc;

  char **argv;

  {

  sig_alarmcatch(die);

  sig_pipeignore();

  if (!argv[1]) die_nomaildir();

  //由于vchkpw或checkpassword之类的程式在启动pop3之前已经将工作目录改变到HOME下了.

  //所以这里直接进入arg指定的Maildir目录.也是由于这个改变目录原因。qamil-pop3d不支持Mailbox.

  if (chdir(argv[1]) == -1) die_nomaildir();

  getlist(); //这里构造了我们前面提到了消息块数组*m

  okay();

  //进入命令循环

  commands(&ssin,pop3commands);

  die();

  }

  ==自此qmail的pop3部分分析基本结束==

  小结

  Maildir/cur 只要用户进行了一次连接,qmail-pop3d就会将new下所有邮件移动这个目录下来(quit命令解释程式中有体现.)

  Maildir/new 用户还没看过新邮件

  可见qmail的pop3部分只与Maildir有联系,与smtp基本无关。也许有人会问怎么pop3代码都完了,怎么没看见有使用 Maildir/tmp目录的地方呢?(只见删除)其实这个tmp目录是qmail-local用来保证可靠的转发所用的临时文件目录。如果你想知道具体怎么可靠法可以看qmail-local的源代码分析或者man maildir 的HOW A MESSAGE IS DELIVERED节.

原文链接:http://www.5dmail.net/html/2006-8-30/2006830231942.htm



 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:使用 Flex 和 Bison 更好地进行错误处理   下一篇:GNU 线性编程工具包(线性优化简介)

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号