qmailからlmtp転送出来るようにするパッチ
[program/patch/qmail/lmtp.git] / qmail-remote-lmtp.patch
1 --- qmail-remote.c.org  Mon Jun 15 19:53:16 1998
2 +++ qmail-remote.c      Tue Apr 14 08:48:29 2015
3 @@ -29,6 +29,11 @@
4  #include "timeoutread.h"
5  #include "timeoutwrite.h"
6  
7 +#include <string.h>
8 +#include <fcntl.h>
9 +#include <sys/socket.h>
10 +#include <sys/un.h>
11 +
12  #define HUGESMTPTEXT 5000
13  
14  #define PORT_SMTP 25 /* silly rabbit, /etc/services is for users */
15 @@ -44,6 +49,8 @@
16  stralloc host = {0};
17  stralloc sender = {0};
18  
19 +int lmtpmode = 0;
20 +
21  saa reciplist = {0};
22  
23  struct ip_address partner;
24 @@ -86,6 +93,12 @@
25  it isn't in my control/locals file, so I don't treat it as local. (#5.4.6)\n");
26  zerodie(); }
27  
28 +void temp_no_lmtp_so_long() { out("ZLMTP file can't open\n"); zerodie(); }
29 +void temp_no_lmtp_socketopen() { out("ZLMTP socket can't open\n"); zerodie(); }
30 +void temp_no_lmtp_open() { out("ZLMTP file can't open\n"); zerodie(); }
31 +void temp_no_lmtp_non_support_multircpt() { out("Zcurrent LMTP don't support multi rcpt...\n"); zerodie(); }
32 +
33 +
34  void outhost()
35  {
36    char x[IPFMT];
37 @@ -224,7 +237,11 @@
38   
39    if (smtpcode() != 220) quit("ZConnected to "," but greeting failed");
40   
41 -  substdio_puts(&smtpto,"HELO ");
42 +  if (lmtpmode){
43 +    substdio_puts(&smtpto,"LHLO ");
44 +  }else{
45 +    substdio_puts(&smtpto,"HELO ");
46 +  }
47    substdio_put(&smtpto,helohost.s,helohost.len);
48    substdio_puts(&smtpto,"\r\n");
49    substdio_flush(&smtpto);
50 @@ -239,6 +256,9 @@
51    if (code >= 400) quit("ZConnected to "," but sender was rejected");
52   
53    flagbother = 0;
54 +  if (lmtpmode && reciplist.len != 1){
55 +    temp_no_lmtp_non_support_multircpt();
56 +  }
57    for (i = 0;i < reciplist.len;++i) {
58      substdio_puts(&smtpto,"RCPT TO:<");
59      substdio_put(&smtpto,reciplist.sa[i].s,reciplist.sa[i].len);
60 @@ -338,6 +358,7 @@
61    int flagallaliases;
62    int flagalias;
63    char *relayhost;
64 +  struct sockaddr_un address;
65   
66    sig_pipeignore();
67    if (argc < 4) perm_usage();
68 @@ -357,7 +378,11 @@
69    if (relayhost) {
70      i = str_chr(relayhost,':');
71      if (relayhost[i]) {
72 -      scan_ulong(relayhost + i + 1,&port);
73 +      if (strcmp(relayhost + i + 1,"lmtp") == 0){
74 +        lmtpmode = 1;
75 +      }else{
76 +        scan_ulong(relayhost + i + 1,&port);
77 +      }
78        relayhost[i] = 0;
79      }
80      if (!stralloc_copys(&host,relayhost)) temp_nomem();
81 @@ -380,7 +405,20 @@
82      ++recips;
83    }
84  
85
86 +  if (lmtpmode){
87 +    stralloc_0(&host);
88 +    if (host.len >= sizeof(address.sun_path) -1) temp_no_lmtp_so_long();
89 +    smtpfd = socket(AF_UNIX,SOCK_STREAM,0);
90 +    if (smtpfd == -1) temp_no_lmtp_socketopen();
91 +    address.sun_family = AF_UNIX;
92 +    strcpy(address.sun_path, host.s);
93 +    if (connect(smtpfd,(struct sockaddr *)&address,sizeof(address)) == -1) temp_no_lmtp_open();
94 +    smtp(); /* does not return */
95 +    close(smtpfd);
96 +    temp_noconn();
97 +    /* end program */
98 +  }
99 +
100    random = now() + (getpid() << 16);
101    switch (relayhost ? dns_ip(&ip,&host) : dns_mxip(&ip,&host,random)) {
102      case DNS_MEM: temp_nomem();