我分析的代码没有“夜未眠”大哥的好,可能还有的不正确,就请各位多多指教,谢谢
[code:1:c552cb0758]#include <sys/types.h>
#include <sys/stat.h>
#include "readwrite.h"
#include "sig.h"
#include "env.h"
#include "byte.h"
#include "exit.h"
#include "fork.h"
#include "open.h"
#include "wait.h"
#include "lock.h"
#include "seek.h"
#include "substdio.h"
#include "getln.h"
#include "strerr.h"
#include "subfd.h"
#include "sgetopt.h"
#include "alloc.h"
#include "error.h"
#include "stralloc.h"
#include "fmt.h"
#include "str.h"
#include "now.h"
#include "case.h"
#include "quote.h"
#include "qmail.h"
#include "slurpclose.h"
#include "myctime.h"
#include "gfrom.h"
#include "auto_patrn.h"
void usage() { strerr_die1x(100,"qmail-local:; usage:; qmail-local [ -nN ] user homedir local dash ext domain sender aliasempty"); }
void temp_nomem() { strerr_die1x(111,"Out of memory. (#4.3.0)"); }
void temp_rewind() { strerr_die1x(111,"Unable to rewind message. (#4.3.0)"); }
void temp_childcrashed() { strerr_die1x(111,"Aack, child crashed. (#4.3.0)"); }
void temp_fork() { strerr_die3x(111,"Unable to fork:; ",error_str(errno),". (#4.3.0)"); }
void temp_read() { strerr_die3x(111,"Unable to read message:; ",error_str(errno),". (#4.3.0)"); }
void temp_slowlock()
{ strerr_die1x(111,"File has been locked for 30 seconds straight. (#4.3.0)"); }
void temp_qmail(fn) char *fn;
{ strerr_die5x(111,"Unable to open ",fn,":; ",error_str(errno),". (#4.3.0)"); }
int flagdoit;
int flag99;
char *user;
char *homedir;
char *local;
char *dash;
char *ext;
char *host;
char *sender;
char *aliasempty;
stralloc safeext = {0};
stralloc ufline = {0};
stralloc rpline = {0};
stralloc envrecip = {0};
stralloc dtline = {0};
stralloc qme = {0};
stralloc ueo = {0};
stralloc cmds = {0};
stralloc messline = {0};
stralloc foo = {0};
char buf[1024];
char outbuf[1024];
/* child process */
char fntmptph[80 + FMT_ULONG * 2];
char fnnewtph[80 + FMT_ULONG * 2];
void tryunlinktmp() { unlink(fntmptph); }/*删除fntmptph文件,或连接*/
void sigalrm() { tryunlinktmp(); _exit(3); }
void maildir_child(dir)
char *dir;
{
unsigned long pid;
unsigned long time;
char host[64];
char *s;
int loop;
struct stat st;
int fd;
substdio ss;
substdio ssout;
sig_alarmcatch(sigalrm);//捕捉时间信号。
if (chdir(dir) == -1) { if (error_temp(errno)) _exit(1); _exit(2); }
pid = getpid();//获取当前的进程号。
host[0] = 0;
gethostname(host,sizeof(host));
for (loop = 0;;++loop)
{
time = now();
s = fntmptph;