⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qmail-inject.c

📁 linux下qmail的源码 本人加了一些注释
💻 C
📖 第 1 页 / 共 2 页
字号:
void dobody(h)stralloc *h;{ put(h->s,h->len);}stralloc torecip = {0};token822_alloc tr = {0};void dorecip(s)char *s;{ if (!quote2(&torecip,s)) die_nomem(); switch(token822_parse(&tr,&torecip,&hfbuf))  {   case -1: die_nomem();   case 0:     substdio_puts(subfderr,"qmail-inject: fatal: unable to parse address: ");     substdio_puts(subfderr,s);     substdio_putsflush(subfderr,"\n");     perm();  } token822_reverse(&tr); rwgeneric(&tr); rwappend(&tr,&reciplist);}stralloc defaultfrom = {0};token822_alloc df = {0};void defaultfrommake(){ char *fullname; fullname = env_get("QMAILNAME"); if (!fullname) fullname = env_get("MAILNAME"); if (!fullname) fullname = env_get("NAME"); if (!token822_ready(&df,20)) die_nomem(); df.len = 0; df.t[df.len].type = TOKEN822_ATOM; df.t[df.len].s = "From"; df.t[df.len].slen = 4; ++df.len; df.t[df.len].type = TOKEN822_COLON; ++df.len; if (fullname && !flagnamecomment)  {   df.t[df.len].type = TOKEN822_QUOTE;   df.t[df.len].s = fullname;   df.t[df.len].slen = str_len(fullname);   ++df.len;   df.t[df.len].type = TOKEN822_LEFT;   ++df.len;  } df.t[df.len].type = mailusertokentype; df.t[df.len].s = mailuser; df.t[df.len].slen = str_len(mailuser); ++df.len; if (mailhost)  {   df.t[df.len].type = TOKEN822_AT;   ++df.len;   df.t[df.len].type = TOKEN822_ATOM;   df.t[df.len].s = mailhost;   df.t[df.len].slen = str_len(mailhost);   ++df.len;  } if (fullname && !flagnamecomment)  {   df.t[df.len].type = TOKEN822_RIGHT;   ++df.len;  } if (fullname && flagnamecomment)  {   df.t[df.len].type = TOKEN822_COMMENT;   df.t[df.len].s = fullname;   df.t[df.len].slen = str_len(fullname);   ++df.len;  } if (token822_unparse(&defaultfrom,&df,LINELEN) != 1) die_nomem(); doordie(&defaultfrom,token822_parse(&df,&defaultfrom,&hfbuf)); doordie(&defaultfrom,token822_addrlist(&hfrewrite,&hfaddr,&df,rwsender)); if (token822_unparse(&defaultfrom,&hfrewrite,LINELEN) != 1) die_nomem();}stralloc defaultreturnpath = {0};token822_alloc drp = {0};stralloc hackedruser = {0};char strnum[FMT_ULONG];void dodefaultreturnpath(){ if (!stralloc_copys(&hackedruser,mailruser)) die_nomem(); if (flaghackmess)  {   if (!stralloc_cats(&hackedruser,"-")) die_nomem();   if (!stralloc_catb(&hackedruser,strnum,fmt_ulong(strnum,(unsigned long) starttime))) die_nomem();   if (!stralloc_cats(&hackedruser,".")) die_nomem();   if (!stralloc_catb(&hackedruser,strnum,fmt_ulong(strnum,(unsigned long) getpid()))) die_nomem();  } if (flaghackrecip)   if (!stralloc_cats(&hackedruser,"-")) die_nomem(); if (!token822_ready(&drp,10)) die_nomem(); drp.len = 0; drp.t[drp.len].type = TOKEN822_ATOM; drp.t[drp.len].s = "Return-Path"; drp.t[drp.len].slen = 11; ++drp.len; drp.t[drp.len].type = TOKEN822_COLON; ++drp.len; drp.t[drp.len].type = TOKEN822_QUOTE; drp.t[drp.len].s = hackedruser.s; drp.t[drp.len].slen = hackedruser.len; ++drp.len; if (mailrhost)  {   drp.t[drp.len].type = TOKEN822_AT;   ++drp.len;   drp.t[drp.len].type = TOKEN822_ATOM;   drp.t[drp.len].s = mailrhost;   drp.t[drp.len].slen = str_len(mailrhost);   ++drp.len;  } if (token822_unparse(&defaultreturnpath,&drp,LINELEN) != 1) die_nomem(); doordie(&defaultreturnpath,token822_parse(&drp,&defaultreturnpath,&hfbuf)); doordie(&defaultreturnpath   ,token822_addrlist(&hfrewrite,&hfaddr,&drp,rwreturn)); if (token822_unparse(&defaultreturnpath,&hfrewrite,LINELEN) != 1) die_nomem();}int flagmft = 0;stralloc mft = {0};struct constmap mapmft;void mft_init(){  char *x;  int r;  x = env_get("QMAILMFTFILE");  if (!x) return;  r = control_readfile(&mft,x,0);  if (r == -1) die_read(); /*XXX*/  if (!r) return;  if (!constmap_init(&mapmft,mft.s,mft.len,0)) die_nomem();  flagmft = 1;}void finishmft(){  int i;  static stralloc sa = {0};  static stralloc sa2 = {0};  if (!flagmft) return;  if (htypeseen[H_MAILFOLLOWUPTO]) return;  for (i = 0;i < tocclist.len;++i)    if (constmap(&mapmft,tocclist.sa[i].s,tocclist.sa[i].len))      break;  if (i == tocclist.len) return;  puts("Mail-Followup-To: ");  i = tocclist.len;  while (i--) {    if (!stralloc_copy(&sa,&tocclist.sa[i])) die_nomem();    if (!stralloc_0(&sa)) die_nomem();    if (!quote2(&sa2,sa.s)) die_nomem();    put(sa2.s,sa2.len);    if (i) puts(",\n  ");  }  puts("\n");}void finishheader(){ flagresent =   htypeseen[H_R_SENDER] || htypeseen[H_R_FROM] || htypeseen[H_R_REPLYTO]   || htypeseen[H_R_TO] || htypeseen[H_R_CC] || htypeseen[H_R_BCC]   || htypeseen[H_R_DATE] || htypeseen[H_R_MESSAGEID]; if (!sender.s)   dodefaultreturnpath(); if (!flagqueue)  {   static stralloc sa = {0};   static stralloc sa2 = {0};   if (!stralloc_copy(&sa,&sender)) die_nomem();   if (!stralloc_0(&sa)) die_nomem();   if (!quote2(&sa2,sa.s)) die_nomem();   puts("Return-Path: <");   put(sa2.s,sa2.len);   puts(">\n");  } /* could check at this point whether there are any recipients */ if (flagqueue)   if (qmail_open(&qqt) == -1) die_qqt(); if (flagresent)  {   if (!htypeseen[H_R_DATE])    {     if (!newfield_datemake(starttime)) die_nomem();     puts("Resent-");     put(newfield_date.s,newfield_date.len);    }   if (!htypeseen[H_R_MESSAGEID])    {     if (!newfield_msgidmake(control_idhost.s,control_idhost.len,starttime)) die_nomem();     puts("Resent-");     put(newfield_msgid.s,newfield_msgid.len);    }   if (!htypeseen[H_R_FROM])    {     defaultfrommake();     puts("Resent-");     put(defaultfrom.s,defaultfrom.len);    }   if (!htypeseen[H_R_TO] && !htypeseen[H_R_CC])     puts("Resent-Cc: recipient list not shown: ;\n");  } else  {   if (!htypeseen[H_DATE])    {     if (!newfield_datemake(starttime)) die_nomem();     put(newfield_date.s,newfield_date.len);    }   if (!htypeseen[H_MESSAGEID])    {     if (!newfield_msgidmake(control_idhost.s,control_idhost.len,starttime)) die_nomem();     put(newfield_msgid.s,newfield_msgid.len);    }   if (!htypeseen[H_FROM])    {     defaultfrommake();     put(defaultfrom.s,defaultfrom.len);    }   if (!htypeseen[H_TO] && !htypeseen[H_CC])     puts("Cc: recipient list not shown: ;\n");   finishmft();  } savedh_print();}void getcontrols(){ static stralloc sa = {0}; char *x; mft_init(); if (chdir(auto_qmail) == -1) die_chdir(); if (control_init() == -1) die_read(); if (control_rldef(&control_defaultdomain,"control/defaultdomain",1,"defaultdomain") != 1)   die_read(); x = env_get("QMAILDEFAULTDOMAIN"); if (x) if (!stralloc_copys(&control_defaultdomain,x)) die_nomem(); if (!stralloc_copys(&sa,".")) die_nomem(); if (!stralloc_cat(&sa,&control_defaultdomain)) die_nomem(); doordie(&sa,token822_parse(&defaultdomain,&sa,&defaultdomainbuf)); if (control_rldef(&control_defaulthost,"control/defaulthost",1,"defaulthost") != 1)   die_read(); x = env_get("QMAILDEFAULTHOST"); if (x) if (!stralloc_copys(&control_defaulthost,x)) die_nomem(); if (!stralloc_copys(&sa,"@")) die_nomem(); if (!stralloc_cat(&sa,&control_defaulthost)) die_nomem(); doordie(&sa,token822_parse(&defaulthost,&sa,&defaulthostbuf)); if (control_rldef(&control_plusdomain,"control/plusdomain",1,"plusdomain") != 1)   die_read(); x = env_get("QMAILPLUSDOMAIN"); if (x) if (!stralloc_copys(&control_plusdomain,x)) die_nomem(); if (!stralloc_copys(&sa,".")) die_nomem(); if (!stralloc_cat(&sa,&control_plusdomain)) die_nomem(); doordie(&sa,token822_parse(&plusdomain,&sa,&plusdomainbuf));
 //读入idhost,idhost用来指定哟间中Message-ID:头字段的主机名
 /*
 例如:idhost值为linuxfane.com 
	那么邮件头中如下: 
	Message-ID:<1234567890.12345.qmail@linuxfane.com>; 
	如果idhost值为rainbow.linuxfane.com 
	那么邮件头中如下: 
	Message-ID:<1234567890.12345.qmail@rainbow.linuxfane.com>;
 */ if (control_rldef(&control_idhost,"control/idhost",1,"idhost") != 1)   die_read(); x = env_get("QMAILIDHOST"); if (x) if (!stralloc_copys(&control_idhost,x)) die_nomem();}#define RECIP_DEFAULT 1#define RECIP_ARGS 2#define RECIP_HEADER 3#define RECIP_AH 4void main(argc,argv)int argc;char **argv;{ int i; int opt; int recipstrategy; sig_pipeignore(); starttime = now(); qmopts = env_get("QMAILINJECT"); if (qmopts)   while (*qmopts)     switch(*qmopts++)      {       case 'c': flagnamecomment = 1; break;       case 's': flagdeletesender = 1; break;       case 'f': flagdeletefrom = 1; break;       case 'i': flagdeletemessid = 1; break;       case 'r': flaghackrecip = 1; break;       case 'm': flaghackmess = 1; break;      } mailhost = env_get("QMAILHOST"); if (!mailhost) mailhost = env_get("MAILHOST"); mailrhost = env_get("QMAILSHOST"); if (!mailrhost) mailrhost = mailhost; mailuser = env_get("QMAILUSER"); if (!mailuser) mailuser = env_get("MAILUSER"); if (!mailuser) mailuser = env_get("USER"); if (!mailuser) mailuser = env_get("LOGNAME"); if (!mailuser) mailuser = "anonymous"; mailusertokentype = TOKEN822_ATOM; if (quote_need(mailuser,str_len(mailuser))) mailusertokentype = TOKEN822_QUOTE; mailruser = env_get("QMAILSUSER"); if (!mailruser) mailruser = mailuser; for (i = 0;i < H_NUM;++i) htypeseen[i] = 0; recipstrategy = RECIP_DEFAULT; flagqueue = 1; getcontrols(); if (!saa_readyplus(&hrlist,1)) die_nomem(); if (!saa_readyplus(&tocclist,1)) die_nomem(); if (!saa_readyplus(&hrrlist,1)) die_nomem(); if (!saa_readyplus(&reciplist,1)) die_nomem(); while ((opt = getopt(argc,argv,"aAhHnNf:")) != opteof)   switch(opt)    {     case 'a': recipstrategy = RECIP_ARGS; break;     case 'A': recipstrategy = RECIP_DEFAULT; break;     case 'h': recipstrategy = RECIP_HEADER; break;     case 'H': recipstrategy = RECIP_AH; break;     case 'n': flagqueue = 0; break;     case 'N': flagqueue = 1; break;     case 'f':       if (!quote2(&sender,optarg)) die_nomem();       doordie(&sender,token822_parse(&envs,&sender,&envsbuf));       token822_reverse(&envs);       rwgeneric(&envs);       token822_reverse(&envs);       if (token822_unquote(&sender,&envs) != 1) die_nomem();       break;     case '?':     default:       perm();    } argc -= optind; argv += optind; if (recipstrategy == RECIP_DEFAULT)   recipstrategy = (*argv ? RECIP_ARGS : RECIP_HEADER); if (recipstrategy != RECIP_HEADER)   while (*argv)     dorecip(*argv++); flagrh = (recipstrategy != RECIP_ARGS); if (headerbody(subfdin,doheaderfield,finishheader,dobody) == -1)   die_read(); exitnicely();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -