diff options
Diffstat (limited to 'sqmail-4.3.07/src/qmail-mfrules.c')
-rw-r--r-- | sqmail-4.3.07/src/qmail-mfrules.c | 173 |
1 files changed, 0 insertions, 173 deletions
diff --git a/sqmail-4.3.07/src/qmail-mfrules.c b/sqmail-4.3.07/src/qmail-mfrules.c deleted file mode 100644 index e8cfc94..0000000 --- a/sqmail-4.3.07/src/qmail-mfrules.c +++ /dev/null @@ -1,173 +0,0 @@ -#include <sys/stat.h> -#include <stdio.h> // rename -#include "logmsg.h" -#include "stralloc.h" -#include "buffer.h" -#include "getln.h" -#include "exit.h" -#include <unistd.h> -#include "open.h" -#include "auto_qmail.h" -#include "cdbmake.h" -#include "fmt.h" -#include "scan.h" -#include "byte.h" -#include "case.h" - -#define WHO "qmail-mfrules" - -int rename(const char *,const char *); // stdio.h - -stralloc address = {0}; -stralloc data = {0}; -stralloc key = {0}; -stralloc line = {0}; - -char inbuf[1024]; -buffer bi; - -int fd; -int fdtemp; -int match = 1; - -struct cdb_make cdb; - -void die_nomem() -{ - logmsg(WHO,112,FATAL,"out of memory"); -} -void die_parse() -{ - if (!stralloc_0(&line)) die_nomem(); - logmsg(WHO,100,ERROR,B("unable to parse this line: ",line.s)); -} -void die_read() -{ - logmsg(WHO,111,ERROR,"unable to read control/mailfromrules"); -} -void die_write() -{ - logmsg(WHO,111,ERROR,"unable to write to control/mailfromrules.tmp"); -} - -char strnum[FMT_ULONG]; -stralloc sanum = {0}; - -void getnum(char *buf,int len,unsigned long *u) -{ - if (!stralloc_copyb(&sanum,buf,len)) die_nomem(); - if (!stralloc_0(&sanum)) die_nomem(); - if (sanum.s[scan_ulong(sanum.s,u)]) die_parse(); -} - -void doaddressdata() -{ - int i; - int left; - int right; - unsigned long bot; - unsigned long top; - - if (byte_chr(address.s,address.len,'=') == address.len) - if (byte_chr(address.s,address.len,'@') == address.len) { - i = byte_chr(address.s,address.len,'-'); - if (i < address.len) { - left = byte_rchr(address.s,i,'.'); - if (left == i) left = 0; else ++left; - - ++i; - right = i + byte_chr(address.s + i,address.len - i,'.'); - - getnum(address.s + left,i - 1 - left,&bot); - getnum(address.s + i,right - i,&top); - if (top > 255) top = 255; - - while (bot <= top) { - if (!stralloc_copyb(&key,address.s,left)) die_nomem(); - if (!stralloc_catb(&key,strnum,fmt_ulong(strnum,bot))) die_nomem(); - if (!stralloc_catb(&key,address.s + right,address.len - right)) die_nomem(); - case_lowerb(key.s,key.len); - if (cdb_make_add(&cdb,key.s,key.len,data.s,data.len) == -1) die_write(); - ++bot; - } - - return; - } - } - - case_lowerb(address.s,address.len); - case_lowerb(data.s,data.len); - if (cdb_make_add(&cdb,address.s,address.len,data.s,data.len) == -1) die_write(); -} - -int main() -{ - int amper; - int i; - int len; - char *x; - char ch; - - umask(033); - if (chdir(auto_qmail) == -1) - logmsg(WHO,111,ERROR,B("unable to chdir to: ",auto_qmail)); - - fd = open_read("control/mailfromrules"); - if (fd == -1) die_read(); - - buffer_init(&bi,read,fd,inbuf,sizeof(inbuf)); - - fdtemp = open_trunc("control/mailfromrules.tmp"); - if (fdtemp == -1) die_write(); - - if (cdb_make_start(&cdb,fdtemp) == -1) die_write(); - - while (match) { - if (getln(&bi,&line,&match,'\n') != 0) die_read(); - - x = line.s; len = line.len; - - if (!len) break; - if (x[0] == '#') continue; - if (x[0] == '\n') continue; - - while (len) { - ch = x[len - 1]; - if (ch != '\n') if (ch != ' ') if (ch != '\t') break; - --len; - } - line.len = len; /* for die_parse() */ - - amper = byte_chr(x,len,'&'); - if (!amper) die_parse(); - if (amper) if (amper == len || amper < 2) die_parse(); - - if (!stralloc_copyb(&address,x,amper)) die_nomem(); - if (!stralloc_copys(&data,"")) die_nomem(); - - x = line.s + amper + 1; len = line.len - amper - 1; - - while (len) { - if (len < 3) die_parse(); /* input checks */ - if ( *x == ',' || *x == ' ' || *x == '\t') die_parse(); - i = byte_chr(x,len,','); /* &addr1,addr2,.. */ - if (i > 0 && i < len) { - if (!stralloc_catb(&data,"+",1)) die_nomem(); - if (!stralloc_catb(&data,x,i)) die_nomem(); - x += i + 1; len -= i + 1; } - else { - if (!stralloc_catb(&data,"+",1)) die_nomem(); - if (!stralloc_catb(&data,x,len)) die_nomem(); - len = 0; } - } - doaddressdata(); - } - - if (cdb_make_finish(&cdb) == -1) die_write(); - if (fsync(fdtemp) == -1) die_write(); - if (close(fdtemp) == -1) die_write(); /* NFS stupidity */ - if (rename("control/mailfromrules.tmp","control/mailfromrules.cdb") == -1) - logmsg(WHO,111,ERROR,"unable to move control/mailfromrules.tmp to control/mailfromrules.cdb"); - - _exit(0); -} |