qmail-qmqpd.c
changeset 0 068428edee47
equal deleted inserted replaced
-1:000000000000 0:068428edee47
       
     1 #include "auto_qmail.h"
       
     2 #include "qmail.h"
       
     3 #include "received.h"
       
     4 #include "sig.h"
       
     5 #include "substdio.h"
       
     6 #include "readwrite.h"
       
     7 #include "exit.h"
       
     8 #include "now.h"
       
     9 #include "fmt.h"
       
    10 #include "env.h"
       
    11 
       
    12 void resources() { _exit(111); }
       
    13 
       
    14 int safewrite(fd,buf,len) int fd; char *buf; int len;
       
    15 {
       
    16   int r;
       
    17   r = write(fd,buf,len);
       
    18   if (r <= 0) _exit(0);
       
    19   return r;
       
    20 }
       
    21 int saferead(fd,buf,len) int fd; char *buf; int len;
       
    22 {
       
    23   int r;
       
    24   r = read(fd,buf,len);
       
    25   if (r <= 0) _exit(0);
       
    26   return r;
       
    27 }
       
    28 
       
    29 char ssinbuf[512];
       
    30 substdio ssin = SUBSTDIO_FDBUF(saferead,0,ssinbuf,sizeof ssinbuf);
       
    31 char ssoutbuf[256];
       
    32 substdio ssout = SUBSTDIO_FDBUF(safewrite,1,ssoutbuf,sizeof ssoutbuf);
       
    33 
       
    34 unsigned long bytesleft = 100;
       
    35 
       
    36 void getbyte(ch)
       
    37 char *ch;
       
    38 {
       
    39   if (!bytesleft--) _exit(100);
       
    40   substdio_get(&ssin,ch,1);
       
    41 }
       
    42 
       
    43 unsigned long getlen()
       
    44 {
       
    45   unsigned long len = 0;
       
    46   char ch;
       
    47 
       
    48   for (;;) {
       
    49     getbyte(&ch);
       
    50     if (ch == ':') return len;
       
    51     if (len > 200000000) resources();
       
    52     len = 10 * len + (ch - '0');
       
    53   }
       
    54 }
       
    55 
       
    56 void getcomma()
       
    57 {
       
    58   char ch;
       
    59   getbyte(&ch);
       
    60   if (ch != ',') _exit(100);
       
    61 }
       
    62 
       
    63 struct qmail qq;
       
    64 
       
    65 void identify()
       
    66 {
       
    67   char *remotehost;
       
    68   char *remoteinfo;
       
    69   char *remoteip;
       
    70   char *local;
       
    71 
       
    72   remotehost = env_get("TCPREMOTEHOST");
       
    73   if (!remotehost) remotehost = "unknown";
       
    74   remoteinfo = env_get("TCPREMOTEINFO");
       
    75   remoteip = env_get("TCPREMOTEIP");
       
    76   if (!remoteip) remoteip = "unknown";
       
    77   local = env_get("TCPLOCALHOST");
       
    78   if (!local) local = env_get("TCPLOCALIP");
       
    79   if (!local) local = "unknown";
       
    80  
       
    81   received(&qq,"QMQP",local,remoteip,remotehost,remoteinfo,(char *) 0);
       
    82 }
       
    83 
       
    84 char buf[1000];
       
    85 char strnum[FMT_ULONG];
       
    86 
       
    87 int getbuf()
       
    88 {
       
    89   unsigned long len;
       
    90   int i;
       
    91 
       
    92   len = getlen();
       
    93   if (len >= 1000) {
       
    94     for (i = 0;i < len;++i) getbyte(buf);
       
    95     getcomma();
       
    96     buf[0] = 0;
       
    97     return 0;
       
    98   }
       
    99 
       
   100   for (i = 0;i < len;++i) getbyte(buf + i);
       
   101   getcomma();
       
   102   buf[len] = 0;
       
   103   return byte_chr(buf,len,'\0') == len;
       
   104 }
       
   105 
       
   106 int flagok = 1;
       
   107 
       
   108 main()
       
   109 {
       
   110   char *result;
       
   111   unsigned long qp;
       
   112   unsigned long len;
       
   113   char ch;
       
   114 
       
   115   sig_pipeignore();
       
   116   sig_alarmcatch(resources);
       
   117   alarm(3600);
       
   118 
       
   119   bytesleft = getlen();
       
   120 
       
   121   len = getlen();
       
   122 
       
   123   if (chdir(auto_qmail) == -1) resources();
       
   124   if (qmail_open(&qq) == -1) resources();
       
   125   qp = qmail_qp(&qq);
       
   126   identify();
       
   127 
       
   128   while (len > 0) { /* XXX: could speed this up */
       
   129     getbyte(&ch);
       
   130     --len;
       
   131     qmail_put(&qq,&ch,1);
       
   132   }
       
   133   getcomma();
       
   134 
       
   135   if (getbuf())
       
   136     qmail_from(&qq,buf);
       
   137   else {
       
   138     qmail_from(&qq,"");
       
   139     qmail_fail(&qq);
       
   140     flagok = 0;
       
   141   }
       
   142 
       
   143   while (bytesleft)
       
   144     if (getbuf())
       
   145       qmail_to(&qq,buf);
       
   146     else {
       
   147       qmail_fail(&qq);
       
   148       flagok = 0;
       
   149     }
       
   150 
       
   151   bytesleft = 1;
       
   152   getcomma();
       
   153 
       
   154   result = qmail_close(&qq);
       
   155 
       
   156   if (!*result) {
       
   157     len = fmt_str(buf,"Kok ");
       
   158     len += fmt_ulong(buf + len,(unsigned long) now());
       
   159     len += fmt_str(buf + len," qp ");
       
   160     len += fmt_ulong(buf + len,qp);
       
   161     buf[len] = 0;
       
   162     result = buf;
       
   163   }
       
   164 
       
   165   if (!flagok)
       
   166     result = "Dsorry, I can't accept addresses like that (#5.1.3)";
       
   167 
       
   168   substdio_put(&ssout,strnum,fmt_ulong(strnum,(unsigned long) str_len(result)));
       
   169   substdio_puts(&ssout,":");
       
   170   substdio_puts(&ssout,result);
       
   171   substdio_puts(&ssout,",");
       
   172   substdio_flush(&ssout);
       
   173   _exit(0);
       
   174 }