程序员眼中的qmail(qmail源代码分析)} 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 线性编程工具包(线性优化简介) 更多相关文章
|
推荐文章
精彩文章
|