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

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

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

  }

  stralloc 2006830231942.htms = {0};

  prioq pq = {0};

  struct message {

  int flagdeleted; //删除标记,在程式退出时进行实际删除动作

  unsigned long size; //文件大小

  char *fn; //文件名

  } *m;

  int numm;//全局变量记录队列长度

  int last = 0;

  void getlist()

  {

  struct prioq_elt pe;

  struct stat st;

  int i;

  maildir_clean(&line);//清除Maildir/tmp/目录下最后访问时间超过 36小时的文件

  if (maildir_scan(&pq,&2006830231942.htms,1,1) == -1) die_scan();

  numm = pq.p ? pq.len : 0; //记录下队列长度

  //通过队列pq构造消息块数组,构建结束后队列pq删除

  m = (struct message *) alloc(numm * sizeof(struct message));//分配消息块

  if (!m) die_nomem();

  for (i = 0;i < numm;++i) {

  if (!prioq_min(&pq,&pe)) { numm = i; break; }

  prioq_delmin(&pq);

  m[i].fn = 2006830231942.htms.s + pe.id;

  m[i].flagdeleted = 0;

  if (stat(m[i].fn,&st) == -1)

  m[i].size = 0;

  else

  m[i].size = st.st_size;

  }

  }

  void pop3_stat() //打印类似 +OK <消息数量><删除标记未设置的消息所占空间>

  { //如 +OK 3 3555表示总共有3条消息,占用空间3555(通过stat取得的)

  int i;

  unsigned long total;

  total = 0;

  for (i = 0;i < numm;++i) if (!m[i].flagdeleted) total += m[i].size;

  puts("+OK ");

  put(strnum,fmt_uint(strnum,numm));

  puts(" ");

  put(strnum,fmt_ulong(strnum,total));

  puts("\r\n");

  flush();

  }

  void pop3_rset()//重置pop对话,清除所有删除标记

  {

  int i;

  for (i = 0;i < numm;++i) m[i].flagdeleted = 0;

  last = 0;

  okay();

  }

  void pop3_last()//显示最后一个消息块

  {

  puts("+OK ");

  put(strnum,fmt_uint(strnum,last));

  puts("\r\n");

  flush();

  }

  void pop3_quit()//结束一次pop对话,删除所有删除标记设置的消息,将new下的消息移到cur下

  {

  int i;

  for (i = 0;i < numm;++i)

  if (m[i].flagdeleted) {

  if (unlink(m[i].fn) == -1) err_nounlink();

  }

  else

  if (str_start(m[i].fn,"new/")) {

  if (!stralloc_copys(&line,"cur/")) die_nomem();

  if (!stralloc_cats(&line,m[i].fn + 4)) die_nomem();

  if (!stralloc_cats(&line,":2,")) die_nomem();

  if (!stralloc_0(&line)) die_nomem();

  rename(m[i].fn,line.s); /* if it fails, bummer */

  }

  okay();

  die();

  }

  //检查消息块是否存在。或消息块的删除标记是否已经设置了

  //成功返回消息块的位置int型

  //失败返回-1

  int msgno(arg) char *arg;

  {

  unsigned long u;

  if (!scan_ulong(arg,&u)) { err_syntax(); return -1; }

  if (!u) { err_nozero(); return -1; }

  --u;

  if (u >= numm) { err_toobig(); return -1; }

  if (m[u].flagdeleted) { err_deleted(); return -1; }

  return u;

  }

  void pop3_dele(arg) char *arg;//将arg指定消息块设置删除标记,实际删除动作将在pop3退出时进行

  {

  int i;

  i = msgno(arg);

  if (i == -1) return;

  m[i].flagdeleted = 1;

  if (i + 1 > last) last = i + 1;

  okay();

  }

  void list(i,flaguidl)

  int i;

  int flaguidl;

  {//显示消息块的内容,如果flaguidl设置,输出消息文件名,否则消息大小

  put(strnum,fmt_uint(strnum,i + 1));

  puts(" ");

  if (flaguidl) printfn(m[i].fn);

  else put(strnum,fmt_ulong(strnum,m[i].size));

  puts("\r\n");

  }

  //如果指定了参数arg那么列出arg指定的消息块的内容,否则列出全部消息

  void dolisting(arg,flaguidl) char *arg; int flaguidl;

  {

  unsigned int i;

  if (*arg) {

  i = msgno(arg);

  if (i == -1) return;

  puts("+OK ");

  list(i,flaguidl);

  }

  else {

  okay();

  for (i = 0;i < numm;++i)

  if (!m[i].flagdeleted)

  list(i,flaguidl);

  puts(".\r\n");

  }

  flush();

  }

  void pop3_uidl(arg) char *arg; { dolisting(arg,1); }

  void pop3_list(arg) char *arg; { dolisting(arg,0); }

  substdio ssmsg; char ssmsgbuf[1024];

  void pop3_top(arg) char *arg;//显示指定消息的内容

  {



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



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

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