summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJannis Hoffmann <jannis@fehcom.de>2024-07-18 15:15:18 +0200
committerJannis Hoffmann <jannis@fehcom.de>2024-07-18 15:15:18 +0200
commit7b4d3ab22988d021d5f12b81aec746f7e486fa52 (patch)
tree651e78e316411a39baadadb1cfaca450e1351c7f
parent25f74781424d5e13f0211c08cce8c2a1d60b9aec (diff)
update to 4.3.09
-rw-r--r--INSTALL44
-rw-r--r--README.md7
-rw-r--r--conf-home19
-rw-r--r--conf-queue8
-rw-r--r--man/qmail-remote.82
-rw-r--r--src/Makefile71
-rw-r--r--src/constmap.c2
-rw-r--r--src/hier.c33
-rw-r--r--src/include/auto_queue.h6
-rw-r--r--src/include/hier.h2
-rw-r--r--src/install.c24
-rw-r--r--src/instcheck.c2
-rw-r--r--src/qmail-clean.c4
-rw-r--r--src/qmail-dksign.c17
-rw-r--r--src/qmail-dkverify.c19
-rw-r--r--src/qmail-getpw.c2
-rw-r--r--src/qmail-ldapam.c6
-rw-r--r--src/qmail-lspawn.c12
-rw-r--r--src/qmail-qmaint.c28
-rw-r--r--src/qmail-qmtpd.c4
-rw-r--r--src/qmail-qread.c4
-rw-r--r--src/qmail-queue.c3
-rw-r--r--src/qmail-remote.c59
-rw-r--r--src/qmail-rspawn.c16
-rw-r--r--src/qmail-send.c101
-rw-r--r--src/qmail-smtpam.c11
-rw-r--r--src/qmail-smtpd.c15
-rw-r--r--src/qmail-start.c10
-rw-r--r--src/qmail-tcpok.c20
-rw-r--r--src/qmail-tcpto.c4
-rw-r--r--src/qmail-todo.c60
-rw-r--r--src/recipients.c12
-rw-r--r--src/spawn.c5
-rw-r--r--src/tcpto.c14
-rw-r--r--src/token822.c2
35 files changed, 370 insertions, 278 deletions
diff --git a/INSTALL b/INSTALL
index 1b60aa6..88838d0 100644
--- a/INSTALL
+++ b/INSTALL
@@ -36,12 +36,14 @@ B) CONFIGURATION
2. Short description:
+ conf-home -- home dir of s/qmail [/var/qmail]
+ conf-queue -- separate queue directory [/var/qmail]
+
conf-break -- the character for VERP addresses [-]
conf-cc -- compiler (no change required)
conf-delivery -- qmail-start default-delivery
conf-djbdns -- DJBNDS libs (not supported yet)
conf-groups*) -- s/qmail groups
- conf-home -- home dir of s/qmail [/var/qmail]
conf-idn2 -- include optional path for libidn2
conf-ids*) -- Unix ids for s/qmail
conf-instances -- QMQ instances to be raised
@@ -82,12 +84,13 @@ B) CONFIGURATION
5. Directories and system interaction:
a) conf-home
- b) conf-qlibs
- c) conf-ssl
- d) conf-ucspissl
- e) conf-log
- f) conf-man
- g) conf-svcdir
+ b) conf-queue
+ c) conf-qlibs
+ d) conf-ssl
+ e) conf-ucspissl
+ f) conf-log
+ g) conf-man
+ h) conf-svcdir
6. Run-time issues:
@@ -126,10 +129,11 @@ C) INSTALLATION
3. Installation on OpenBSD
- s/qmail should be placed under
- /usr/local/qmail
- -- or --
- mount -u -o suid /var
+ s/qmail can be placed under
+ /usr/local/sqmail (binaries, contol, and others)
+ and queue at
+ /var/sqmail/(queue)
+ no requiring 'mount -u -o suid /var' any more.
4. Upgrade from an existing Qmail
@@ -187,6 +191,22 @@ C) INSTALLATION
- Check conf-cc for more restrictive settings.
+7. Splitted installation directories
+
+ s/qmail can be be splitted up two separate main directories
+ as givin in
+
+ * conf-home: followed by ./bin, ./user, ./alias, ./ssl, and others.
+ A typical place would be '/usr/bin/sqmail'.
+
+ * conf-queue: followed by ./queue and all required subdirectories.
+ A typical place would be '/var/sqmail/'.
+
+ Note: The legacy directory is however still '/var/qmail'.
+ Usage of a splitted directory setup is mainly forseen for
+ integrators providing binary packages of s/qmail with
+ the requirement to obey their particular installation paths.
+
D) DKIM CONFIGURATION
@@ -246,4 +266,4 @@ E) MISCELLANEOUS
Visit https://www.fehcom.de/sqmail/sqmail.html to
access online man-pages and documentation.
-Date: June, 18th 2023 (feh)
+Date: February, 5th 2024 (feh)
diff --git a/README.md b/README.md
index 96a536b..d8231b3 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,6 @@ WHAT IT IS:
- Multi-tenancy capabilities
- s/qmail uses the concept of D.J. Bernstein's
coding without compromise
-- Linux systemd compatible
INCLUDING:
@@ -38,7 +37,7 @@ REQUIREMENTS:
- ucspi-ssl (> 0.12.x) -- won't run without it
- ucspi-tcp6 (generating the cdb)
- daemontools package (supervising the services),
- any other will do as well
+ any other will do as well (eg. systemd)
- libidn2 for EAI support
- OpenSSL > 1.1.1 or LibreSSL > 3.7.0 to support Ed25519 signatures
@@ -65,6 +64,8 @@ INTERNAL CHANGES FROM QMAIL:
- TLSA DNS lookup for qmail-remote
- Additional queue/dkim staging directories
- Less single character buffering for I/O; convenient buffer sizes
+- s/qmail's queue and binary files may have different locations
+- Maildir/ is now the default delivery for qmail-local
USER INTERFACE CHANGES:
@@ -103,4 +104,4 @@ s/qmail (4.3) -- this README covers the main s/qmail merits.
See doc/CHANGELOG for version information.
-Date: Janary, 8th 2024 (feh)
+Date: February, 5th 2024 (feh)
diff --git a/conf-home b/conf-home
index ae70bfa..0f60161 100644
--- a/conf-home
+++ b/conf-home
@@ -1,17 +1,10 @@
/var/qmail
# This is the sqmail home directory. It must be a local directory, not
-# shared among machines. This is where qmail queues all mail messages.
+# shared among machines. The mail queue may reside at a different directory. e.g.:
+#
+# /usr/bin/sqmail => ./alias + ./bin + ./control + ./ssl + ./user (+ others)
+# /var/sqmail => ./queue
+#
+# Check conf-queue!
-/usr/local/qmail
-
-# This is the alternative of OS with don't allow suid on /var (OpenBSD).
-
-# The queue (except for bounce message contents) is crashproof, if the
-# filesystem guarantees that single-byte writes are atomic and that
-# directory operations are synchronous. These guarantees are provided by
-# fixed-block filesystems such as UFS and by journaling filesystems. Under
-# Linux, make sure that all mail-handling filesystems are mounted with
-# synchronous metadata.
-
-# Note: The sqmail binaries do not need to share the same mount point.
diff --git a/conf-queue b/conf-queue
new file mode 100644
index 0000000..bf1987a
--- /dev/null
+++ b/conf-queue
@@ -0,0 +1,8 @@
+/var/qmail
+
+# Note: ./queue/ is added automatically!
+
+# This is the legacy setup having sqmail's queue underneath a single directory.
+# You may however favor a splitt setting:
+
+# /var/sqmail
diff --git a/man/qmail-remote.8 b/man/qmail-remote.8
index 363c972..c40a7ee 100644
--- a/man/qmail-remote.8
+++ b/man/qmail-remote.8
@@ -234,7 +234,7 @@ K
TLS (CERT pinning) transmitted message accepted
.TP 5
K
-TLS (TLSA validated) transmitted message accepted
+TLS (TLSA [EE|TA] validated) transmitted message accepted
.PP
.B qmail-remote
needs to read some X.509 certificates and key files
diff --git a/src/Makefile b/src/Makefile
index d560613..2dc256e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -80,8 +80,8 @@ compile auto_qmail.c
./compile auto_qmail.c
auto_queue.c: \
-auto-str ../conf-home
- ./auto-str auto_queue `head -1 ../conf-home` > auto_queue.c
+auto-str ../conf-queue
+ ./auto-str auto_queue `head -1 ../conf-queue` > auto_queue.c
auto_queue.o: \
compile auto_queue.c
@@ -509,8 +509,8 @@ tryidn2.c compile load
rm -f tryind2.o tryidn2
install: \
-load install.o hier.o auto_qmail.o auto_split.o auto_uids.o fifo.o qlibs.lib
- ./load install hier.o auto_qmail.o auto_split.o auto_uids.o fifo.o \
+load install.o hier.o auto_qmail.o auto_queue.o auto_split.o auto_uids.o fifo.o qlibs.lib
+ ./load install hier.o auto_qmail.o auto_queue.o auto_split.o auto_uids.o fifo.o \
`cat qlibs.lib`
install.o: \
@@ -518,8 +518,8 @@ compile install.c
./compile install.c
instcheck: \
-load instcheck.o hier.o auto_qmail.o auto_split.o auto_uids.o qlibs.lib
- ./load instcheck hier.o auto_qmail.o auto_split.o auto_uids.o \
+load instcheck.o hier.o auto_qmail.o auto_queue.o auto_split.o auto_uids.o qlibs.lib
+ ./load instcheck hier.o auto_qmail.o auto_split.o auto_uids.o auto_queue.o \
`cat qlibs.lib`
instcheck.o: \
@@ -785,8 +785,9 @@ compile qmail-authuser.c hasspnam.h hasuserpw.h
./compile qmail-authuser.c
qmail-clean: \
-load qmail-clean.o fmtqfn.o now.o auto_qmail.o auto_split.o qlibs.lib
- ./load qmail-clean fmtqfn.o now.o auto_qmail.o auto_split.o `cat qlibs.lib`
+load qmail-clean.o fmtqfn.o now.o auto_qmail.o auto_queue.o auto_split.o qlibs.lib
+ ./load qmail-clean fmtqfn.o now.o auto_qmail.o auto_queue.o auto_split.o \
+ `cat qlibs.lib`
qmail-clean.o: \
compile qmail-clean.c
@@ -804,9 +805,9 @@ compile qmail-dkim.cpp dkim.cpp dkimbase.cpp dkimsign.cpp dkimverify.cpp
qmail-dksign: \
load qmail-dksign.o control.o constmap.o fmtqfn.o rcpthosts.o qmail-dkim \
-auto_qmail.o auto_split.o qlibs.lib
+auto_qmail.o auto_queue.o auto_split.o qlibs.lib
./load qmail-dksign control.o constmap.o fmtqfn.o rcpthosts.o \
- auto_qmail.o auto_split.o `cat qlibs.lib`
+ auto_qmail.o auto_queue.o auto_split.o `cat qlibs.lib`
qmail-dksign.o: \
compile qmail-dksign.c
@@ -814,9 +815,9 @@ compile qmail-dksign.c
qmail-dkverify: \
load qmail-dkverify.o control.o fmtqfn.o qmail-dkim \
-auto_qmail.o auto_split.o qmail.o qlibs.lib
+auto_qmail.o auto_queue.o auto_split.o qmail.o qlibs.lib
./load qmail-dkverify qmail.o control.o fmtqfn.o \
- auto_qmail.o auto_split.o `cat qlibs.lib`
+ auto_qmail.o auto_queue.o auto_split.o `cat qlibs.lib`
qmail-dkverify.o: \
compile qmail-dkverify.c
@@ -868,9 +869,9 @@ compile qmail-local.c
qmail-lspawn: \
load qmail-lspawn.o spawn.o \
-auto_qmail.o auto_uids.o auto_spawn.o qlibs.lib
+auto_qmail.o auto_queue.o auto_uids.o auto_spawn.o qlibs.lib
./load qmail-lspawn spawn.o \
- auto_qmail.o auto_uids.o auto_spawn.o `cat qlibs.lib`
+ auto_qmail.o auto_queue.o auto_uids.o auto_spawn.o `cat qlibs.lib`
qmail-lspawn.o: \
compile qmail-lspawn.c
@@ -927,12 +928,12 @@ compile qmail-vmailuser.c
qmail-smtpam: \
load qmail-smtpam.o control.o now.o dns.o constmap.o \
-ipalloc.o ipme.o quote.o auto_qmail.o tcpto.o \
+ipalloc.o ipme.o quote.o auto_qmail.o auto_queue.o tcpto.o \
tls_timeoutio.o tls_errors.o tls_remote.o dns_tlsa.o \
ssl.lib dns.lib socket.lib qlibs.lib ucspissl.a
./load qmail-smtpam constmap.o control.o dns_tlsa.o \
tcpto.o now.o dns.o ipalloc.o ipme.o quote.o auto_qmail.o \
- tls_errors.o tls_remote.o tls_timeoutio.o ucspissl.a \
+ auto_queue.o tls_errors.o tls_remote.o tls_timeoutio.o ucspissl.a \
`cat ssl.lib` `cat dns.lib` `cat socket.lib` `cat qlibs.lib`
qmail-smtpam.o: \
@@ -1036,9 +1037,9 @@ compile qmail-qmtpd.c
qmail-qread: \
load qmail-qread.o fmtqfn.o readsubdir.o date822fmt.o datetime.a \
-auto_qmail.o auto_split.o qlibs.lib
+auto_queue.o auto_split.o qlibs.lib
./load qmail-qread fmtqfn.o readsubdir.o date822fmt.o \
- datetime.a auto_qmail.o auto_split.o `cat qlibs.lib`
+ datetime.a auto_queue.o auto_split.o `cat qlibs.lib`
qmail-qread.o: \
compile qmail-qread.c
@@ -1055,8 +1056,8 @@ warn-auto.sh qmail-qstat.sh ../conf-home ../conf-break ../conf-split
qmail-queue: \
load qmail-queue.o triggerpull.o fmtqfn.o now.o date822fmt.o \
-datetime.a auto_qmail.o auto_split.o auto_uids.o qlibs.lib
- ./load qmail-queue auto_qmail.o auto_split.o auto_uids.o \
+datetime.a auto_qmail.o auto_queue.o auto_split.o auto_uids.o qlibs.lib
+ ./load qmail-queue auto_qmail.o auto_queue.o auto_split.o auto_uids.o \
triggerpull.o fmtqfn.o now.o date822fmt.o datetime.a `cat qlibs.lib`
qmail-queue.o: \
@@ -1064,9 +1065,9 @@ compile qmail-queue.c
./compile qmail-queue.c
qmail-qmaint: \
-load qmail-qmaint.o auto_qmail.o auto_split.o auto_uids.o fifo.o \
+load qmail-qmaint.o auto_qmail.o auto_queue.o auto_split.o auto_uids.o fifo.o \
fmtqfn.o readsubdir.o date822fmt.o datetime.a qlibs.lib
- ./load qmail-qmaint auto_qmail.o auto_split.o auto_uids.o fifo.o \
+ ./load qmail-qmaint auto_qmail.o auto_queue.o auto_split.o auto_uids.o fifo.o \
fmtqfn.o readsubdir.o date822fmt.o datetime.a `cat qlibs.lib`
qmail-qmaint.o: \
@@ -1076,11 +1077,11 @@ compile qmail-qmaint.c
qmail-remote: \
load qmail-remote.o control.o tcpto.o now.o dns.o ipalloc.o ipme.o \
quote.o tls_timeoutio.o tls_errors.o tls_remote.o dns_tlsa.o \
-base64.o constmap.o md5c.o hmac_md5.o auto_qmail.o \
+base64.o constmap.o md5c.o hmac_md5.o auto_qmail.o auto_queue.o \
ssl.lib dns.lib socket.lib qlibs.lib idn2.lib ucspissl.a
./load qmail-remote control.o tcpto.o now.o \
base64.o constmap.o md5c.o hmac_md5.o ipalloc.o ipme.o \
- quote.o dns.o ucspissl.a auto_qmail.o dns_tlsa.o \
+ quote.o dns.o ucspissl.a auto_qmail.o auto_queue.o dns_tlsa.o \
tls_errors.o tls_remote.o tls_timeoutio.o ucspissl.a \
`cat ssl.lib` `cat dns.lib` `cat socket.lib` `cat qlibs.lib` `cat idn2.lib`
@@ -1090,9 +1091,9 @@ compile qmail-remote.c
qmail-rspawn: \
load qmail-rspawn.o spawn.o tcpto_clean.o now.o \
-auto_qmail.o auto_uids.o auto_spawn.o qlibs.lib
+auto_qmail.o auto_queue.o auto_uids.o auto_spawn.o qlibs.lib
./load qmail-rspawn spawn.o tcpto_clean.o now.o \
- auto_qmail.o auto_uids.o auto_spawn.o `cat qlibs.lib`
+ auto_qmail.o auto_queue.o auto_uids.o auto_spawn.o `cat qlibs.lib`
qmail-rspawn.o: \
compile qmail-rspawn.c
@@ -1101,10 +1102,10 @@ compile qmail-rspawn.c
qmail-send: \
load qmail-send.o qsutil.o control.o constmap.o newfield.o prioq.o \
trigger.o fmtqfn.o quote.o now.o readsubdir.o qmail.o date822fmt.o \
-datetime.a auto_qmail.o auto_split.o qlibs.lib
+datetime.a auto_qmail.o auto_queue.o auto_split.o qlibs.lib
./load qmail-send qsutil.o control.o constmap.o newfield.o \
- prioq.o trigger.o fmtqfn.o quote.o now.o readsubdir.o \
- qmail.o date822fmt.o datetime.a auto_qmail.o auto_split.o `cat qlibs.lib`
+ prioq.o trigger.o fmtqfn.o quote.o now.o readsubdir.o qmail.o \
+ date822fmt.o datetime.a auto_qmail.o auto_queue.o auto_split.o `cat qlibs.lib`
qmail-send.o: \
compile qmail-send.c
@@ -1146,16 +1147,16 @@ compile qmail-start.c
./compile qmail-start.c
qmail-tcpok: \
-load qmail-tcpok.o auto_qmail.o qlibs.lib
- ./load qmail-tcpok auto_qmail.o `cat qlibs.lib`
+load qmail-tcpok.o auto_queue.o qlibs.lib
+ ./load qmail-tcpok auto_queue.o `cat qlibs.lib`
qmail-tcpok.o: \
compile qmail-tcpok.c
./compile qmail-tcpok.c
qmail-tcpto: \
-load qmail-tcpto.o now.o auto_qmail.o qlibs.lib
- ./load qmail-tcpto now.o auto_qmail.o `cat qlibs.lib`
+load qmail-tcpto.o now.o auto_queue.o qlibs.lib
+ ./load qmail-tcpto now.o auto_queue.o `cat qlibs.lib`
qmail-tcpto.o: \
compile qmail-tcpto.c
@@ -1163,9 +1164,9 @@ compile qmail-tcpto.c
qmail-todo: \
load qmail-todo.o control.o constmap.o trigger.o fmtqfn.o \
-now.o qsutil.o readsubdir.o auto_qmail.o auto_split.o qlibs.lib
+now.o qsutil.o readsubdir.o auto_qmail.o auto_queue.o auto_split.o qlibs.lib
./load qmail-todo control.o constmap.o trigger.o fmtqfn.o now.o \
- readsubdir.o qsutil.o auto_qmail.o auto_split.o `cat qlibs.lib`
+ readsubdir.o qsutil.o auto_qmail.o auto_queue.o auto_split.o `cat qlibs.lib`
qmail-todo.o: \
compile qmail-todo.c
diff --git a/src/constmap.c b/src/constmap.c
index ea153ea..469c4ea 100644
--- a/src/constmap.c
+++ b/src/constmap.c
@@ -145,7 +145,7 @@ int constmap_init_char(struct constmap *cm,char *s,int len,int flagcolon,char fl
++pos;
i = j + 1;
}
- return 1;
+ return 1;
}
alloc_free(cm->hash);
}
diff --git a/src/hier.c b/src/hier.c
index 5169912..d628c05 100644
--- a/src/hier.c
+++ b/src/hier.c
@@ -1,4 +1,5 @@
#include "auto_qmail.h"
+#include "auto_queue.h"
#include "auto_split.h"
#include "auto_uids.h"
#include "fmt.h"
@@ -14,7 +15,7 @@ void dsplit(char *base,int uid,int mode) /* base must be under 100 bytes */
char *x;
unsigned long i;
- d(auto_qmail,base,uid,auto_gidq,mode);
+ d(auto_queue,base,uid,auto_gidq,mode);
for (i = 0; i < auto_split; ++i) {
x = buf;
@@ -23,22 +24,26 @@ void dsplit(char *base,int uid,int mode) /* base must be under 100 bytes */
x += fmt_ulong(x,i);
*x = 0;
- d(auto_qmail,buf,uid,auto_gidq,mode);
+ d(auto_queue,buf,uid,auto_gidq,mode);
}
}
void hier()
{
- h(auto_qmail,auto_uido,auto_gidq,0755);
+ h(auto_qmail,auto_queue,auto_uido,auto_gidq,0755);
+
+ /* s/qmail main directory */
d(auto_qmail,"control",auto_uido,auto_gidq,0755);
d(auto_qmail,"users",auto_uido,auto_gidq,0755);
d(auto_qmail,"bin",auto_uido,auto_gidq,0755);
d(auto_qmail,"alias",auto_uida,auto_gidq,02755);
- d(auto_qmail,"queue",auto_uidq,auto_gidq,0750);
- d(auto_qmail,"queue/pid",auto_uidq,auto_gidq,0700);
- d(auto_qmail,"queue/bounce",auto_uids,auto_gidq,0700);
+ /* s/qmail queue directory */
+
+ d(auto_queue,"queue",auto_uidq,auto_gidq,0750);
+ d(auto_queue,"queue/pid",auto_uidq,auto_gidq,0700);
+ d(auto_queue,"queue/bounce",auto_uids,auto_gidq,0700);
dsplit("queue/dkim",auto_uidq,0750);
dsplit("queue/mess",auto_uidq,0750);
@@ -48,10 +53,12 @@ void hier()
dsplit("queue/local",auto_uids,0700);
dsplit("queue/remote",auto_uids,0700);
- d(auto_qmail,"queue/lock",auto_uidq,auto_gidq,0750);
- z(auto_qmail,"queue/lock/tcpto",TCPTO_BUFSIZ,auto_uidr,auto_gidq,0644);
- z(auto_qmail,"queue/lock/sendmutex",0,auto_uids,auto_gidq,0600);
- p(auto_qmail,"queue/lock/trigger",auto_uids,auto_gidq,0622);
+ d(auto_queue,"queue/lock",auto_uidq,auto_gidq,0750);
+ z(auto_queue,"queue/lock/tcpto",TCPTO_BUFSIZ,auto_uidr,auto_gidq,0644);
+ z(auto_queue,"queue/lock/sendmutex",0,auto_uids,auto_gidq,0600);
+ p(auto_queue,"queue/lock/trigger",auto_uids,auto_gidq,0622);
+
+ /* s/qmail core programs */
c(auto_qmail,"bin","qmail-queue",auto_uidq,auto_gidq,04711);
c(auto_qmail,"bin","qmail-qmaint",auto_uidq,auto_gidq,0711);
@@ -97,6 +104,8 @@ void hier()
c(auto_qmail,"bin","qmail-qmtpd",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","qmail-smtpd",auto_uido,auto_gidq,0755);
+ /* s/qmail user programs; can be linked/moved to usr path */
+
c(auto_qmail,"bin","predate",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","datemail",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","mailsubj",auto_uido,auto_gidq,0755);
@@ -122,6 +131,8 @@ void hier()
c(auto_qmail,"bin","srsforward",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","srsreverse",auto_uido,auto_gidq,0755);
+ /* s/qmail DNS user programs; can be linked to usr path */
+
c(auto_qmail,"bin","ipmeprint",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","spfquery",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","dnscname",auto_uido,auto_gidq,0755);
@@ -133,6 +144,8 @@ void hier()
c(auto_qmail,"bin","dnstxt",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","hostname",auto_uido,auto_gidq,0755);
+ /* s/qmail qmailanalog programs */
+
c(auto_qmail,"bin","columnt",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","ddist",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","deferrals",auto_uido,auto_gidq,0755);
diff --git a/src/include/auto_queue.h b/src/include/auto_queue.h
new file mode 100644
index 0000000..cc4645f
--- /dev/null
+++ b/src/include/auto_queue.h
@@ -0,0 +1,6 @@
+#ifndef AUTO_QUEUE_H
+#define AUTO_QUEUE_H
+
+extern char auto_queue[];
+
+#endif
diff --git a/src/include/hier.h b/src/include/hier.h
index f040e79..8d9b0f2 100644
--- a/src/include/hier.h
+++ b/src/include/hier.h
@@ -2,7 +2,7 @@
#define HIER_H
void c(char *,char *,char *,int,int,int);
-void h(char *,int,int,int);
+void h(char *,char *,int,int,int);
void d(char *,char *,int,int,int);
void p(char *,char *,int,int,int);
void z(char *,char *,int,int,int,int);
diff --git a/src/install.c b/src/install.c
index c738fb7..e7d1a82 100644
--- a/src/install.c
+++ b/src/install.c
@@ -12,7 +12,7 @@ extern void hier();
int fdsourcedir = -1;
-void h(char *home,int uid,int gid,int mode)
+void h(char *home,char *queue,int uid,int gid,int mode)
{
if (mkdir(home,0700) == -1)
if (errno != EEXIST)
@@ -21,6 +21,16 @@ void h(char *home,int uid,int gid,int mode)
logmsg(WHO,111,FATAL,B("unable to chown: ",home));
if (chmod(home,mode) == -1)
logmsg(WHO,111,FATAL,B("unable to chmod: ",home));
+
+ if (mkdir(queue,0700) == -1) {
+ if (errno != EEXIST)
+ logmsg(WHO,111,FATAL,B("unable to mkdir: ",queue));
+ } else {
+ if (chown(queue,uid,gid) == -1)
+ logmsg(WHO,111,FATAL,B("unable to chown: ",queue));
+ if (chmod(queue,mode) == -1)
+ logmsg(WHO,111,FATAL,B("unable to chmod: ",queue));
+ }
}
void d(char *home,char *subdir,int uid,int gid,int mode)
@@ -36,17 +46,17 @@ void d(char *home,char *subdir,int uid,int gid,int mode)
logmsg(WHO,111,FATAL,B("unable to chmod: ",home,"/",subdir));
}
-void p(char *home,char *fifo,int uid,int gid,int mode)
+void p(char *queue,char *fifo,int uid,int gid,int mode)
{
- if (chdir(home) == -1)
- logmsg(WHO,110,FATAL,B("unable to switch to: ",home));
+ if (chdir(queue) == -1)
+ logmsg(WHO,110,FATAL,B("unable to switch to: ",queue,"/queue"));
if (fifo_make(fifo,0700) == -1)
if (errno != EEXIST)
- logmsg(WHO,111,FATAL,B("unable to mkfifo: ",home,"/",fifo));
+ logmsg(WHO,111,FATAL,B("unable to mkfifo: ",queue,"/queue/",fifo));
if (chown(fifo,uid,gid) == -1)
- logmsg(WHO,111,FATAL,B("unable to chown: ",home,"/",fifo));
+ logmsg(WHO,111,FATAL,B("unable to chown: ",queue,"/queue/",fifo));
if (chmod(fifo,mode) == -1)
- logmsg(WHO,111,FATAL,B("unable to chmod: ",home,"/",fifo));
+ logmsg(WHO,111,FATAL,B("unable to chmod: ",queue,"/queue/",fifo));
}
char inbuf[BUFFER_INSIZE];
diff --git a/src/instcheck.c b/src/instcheck.c
index e47da87..744ce34 100644
--- a/src/instcheck.c
+++ b/src/instcheck.c
@@ -31,7 +31,7 @@ void perm(char *prefix1,char *prefix2,char *prefix3,char *file,int type,int uid,
logmsg(WHO,0,WARN,B("file has wrong type: ",prefix1,prefix2,prefix3,file));
}
-void h(char *home,int uid,int gid,int mode)
+void h(char *home,char *queue,int uid,int gid,int mode)
{
perm("","","",home,S_IFDIR,uid,gid,mode);
}
diff --git a/src/qmail-clean.c b/src/qmail-clean.c
index df149a5..db52b9b 100644
--- a/src/qmail-clean.c
+++ b/src/qmail-clean.c
@@ -14,7 +14,7 @@
#include "exit.h"
#include "error.h"
#include "fmtqfn.h"
-#include "auto_qmail.h"
+#include "auto_queue.h"
#define OSSIFIED 129600 /* see qmail-send.c */
@@ -58,7 +58,7 @@ int main()
int cleanuploop;
unsigned long id;
- if (chdir(auto_qmail) == -1) _exit(110);
+ if (chdir(auto_queue) == -1) _exit(110);
if (chdir("queue") == -1) _exit(110);
sig_pipeignore();
diff --git a/src/qmail-dksign.c b/src/qmail-dksign.c
index f5d4895..8a2a2b7 100644
--- a/src/qmail-dksign.c
+++ b/src/qmail-dksign.c
@@ -9,6 +9,7 @@
#include "buffer.h"
#include "error.h"
#include "auto_qmail.h"
+#include "auto_queue.h"
#include "control.h"
#include "str.h"
#include "exit.h"
@@ -28,7 +29,7 @@
#define WHO "qmail-dksign"
-#define DOMAINKEYS "ssl/domainkeys/"
+#define DOMAINKEYS "/ssl/domainkeys/"
/** @file qmail-dksign.c -- generate signature and attach in DKIM header to outgoing message
@@ -59,7 +60,7 @@ char outbuf[BUFSIZE_MESS];
buffer bo = BUFFER_INIT(write,1,outbuf,sizeof(outbuf));
void die(int e) { _exit(e); }
-void die_write(char *fn) { unlink(fn); die(53); };
+void die_write(char *fn) { unlink(fn); die(62); };
void die_read() { die(54); };
void out(char *s) { if (buffer_puts(&bo,s) == -1) _exit(111); }
void zero() { if (buffer_put(&bo,"\0",1) == -1) _exit(111); }
@@ -121,7 +122,7 @@ void temp_nosignkey()
out(rsakey.s);
out(" or ");
out(ecckey.s);
- out(". (#4.3.0)\n");
+ out(". (#4.3.0)\n");
zerodie();
}
@@ -202,6 +203,8 @@ void dkim_stage()
struct stat st;
char tmpbuf[BUFSIZE_MESS + 2]; // intermediate write buffer
+ if (chdir(auto_queue) == -1) temp_chdir();
+
if (!stralloc_ready(&fndkin,FMTQFN)) temp_nomem();
if (!stralloc_ready(&fndkout,FMTQFN)) temp_nomem();
@@ -430,8 +433,6 @@ void dkim_setup()
}
}
}
-
- return;
}
int main(int argc,char **args)
@@ -470,11 +471,13 @@ int main(int argc,char **args)
/* Setup keys: they are composed from selector */
case_lowerb(sender.s,sender.len); // needs to be lowercase
- if (!stralloc_copys(&rsakey,DOMAINKEYS)) temp_nomem();
+ if (!stralloc_copys(&rsakey,auto_qmail)) temp_nomem();
+ if (!stralloc_cats(&rsakey,DOMAINKEYS)) temp_nomem();
if (!stralloc_cats(&rsakey,sender.s)) temp_nomem();
if (!stralloc_cats(&rsakey,"/")) temp_nomem();
- if (!stralloc_copys(&ecckey,DOMAINKEYS)) temp_nomem();
+ if (!stralloc_copys(&ecckey,auto_qmail)) temp_nomem();
+ if (!stralloc_cats(&ecckey,DOMAINKEYS)) temp_nomem();
if (!stralloc_cats(&ecckey,sender.s)) temp_nomem();
if (!stralloc_cats(&ecckey,"/")) temp_nomem();
diff --git a/src/qmail-dkverify.c b/src/qmail-dkverify.c
index be73a80..8e4d51e 100644
--- a/src/qmail-dkverify.c
+++ b/src/qmail-dkverify.c
@@ -8,6 +8,7 @@
#include "buffer.h"
#include "error.h"
#include "auto_qmail.h"
+#include "auto_queue.h"
#include "str.h"
#include "exit.h"
#include "uint_t.h"
@@ -47,8 +48,8 @@ char outbuf[BUFSIZE_MESS];
buffer bo = BUFFER_INIT(write,1,outbuf,sizeof(outbuf)); // output message
void die(int e) { _exit(e); }
-void die_pipe(char *fn) { unlink(fn); die(53); };
-void die_write(char *fn) { unlink(fn); die(53); };
+void die_pipe(char *fn) { unlink(fn); die(54); };
+void die_write(char *fn) { unlink(fn); die(62); };
void die_read() { die(54); };
void out(char *s) { if (buffer_puts(&bo,s) == -1) _exit(111); }
void zero() { if (buffer_put(&bo,"\0",1) == -1) _exit(111); }
@@ -112,6 +113,8 @@ void dkim_stage()
struct stat st;
char tmpbuf[BUFSIZE_MESS + 2];
+ if (chdir(auto_queue) == -1) temp_chdir();
+
if (!stralloc_ready(&fndkin,FMTQFN)) temp_nomem();
if (!stralloc_ready(&fndkout,FMTQFN)) temp_nomem();
@@ -159,8 +162,8 @@ int mess_dkim()
buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
if (!stralloc_copys(&senddomain,"")) temp_nomem();
-
- for (;;) {
+
+ for (;;) {
if (getln(&bi,&line,&match,'\n') == -1) temp_read();
if (case_starts(line.s,"DKIM-Signature: ")) r = 1;
if (r == 1) {
@@ -170,7 +173,11 @@ int mess_dkim()
end = str_chr(line.s,'\n'); // From: user@senddomain\n
ket = str_chr(line.s,'>'); // From: User <user@senddomain>
len = (ket < end) ? ket : end;
- if (!stralloc_copyb(&senddomain,line.s + at + 1,len - at - 1)) temp_nomem();
+ len -= at - 1; // From: User <user@>
+ if (len > 0) {
+ if (!stralloc_copyb(&senddomain,line.s + at + 1,len)) temp_nomem();
+ } else
+ if (!stralloc_copys(&senddomain,"unknown")) temp_nomem();
r = 2;
}
}
@@ -326,8 +333,6 @@ int qmail_queue()
case 10: return 1;
default: return 0;
}
-
- return 0;
}
void dkim_unlink()
diff --git a/src/qmail-getpw.c b/src/qmail-getpw.c
index f801c3c..5cd4cfe 100644
--- a/src/qmail-getpw.c
+++ b/src/qmail-getpw.c
@@ -47,7 +47,7 @@ int userext()
if (errno) _exit(QLX_NFS);
}
}
- if (extension == local) return 0;
+ if (extension == local) return 0;
--extension;
}
}
diff --git a/src/qmail-ldapam.c b/src/qmail-ldapam.c
index 624b39e..255aaee 100644
--- a/src/qmail-ldapam.c
+++ b/src/qmail-ldapam.c
@@ -177,13 +177,13 @@ int main (int argc, char **argv)
int f, h, j, k, p, c, r, t, w;
int rc;
- if (!argv[1]) logmsg(WHO,100,USAGE,"qmail-ldapam [-d|-m] prog");
+ if (!argv[1]) logmsg(WHO,100,USAGE," [-d|-m] prog");
if (!case_diffs(argv[1],FLAG_DIR)) {
- if (!argv[2]) logmsg(WHO,100,USAGE,"qmail-ldapam [-d|-m] prog");
+ if (!argv[2]) logmsg(WHO,100,USAGE," [-d|-m] prog");
flaghome = 1;
} else {
if (!case_diffs(argv[1],FLAG_MAIL)) {
- if (!argv[2]) logmsg(WHO,100,USAGE,"qmail-ldapam [-d|-m] prog");
+ if (!argv[2]) logmsg(WHO,100,USAGE," [-d|-m] prog");
flagmail = 1;
}
}
diff --git a/src/qmail-lspawn.c b/src/qmail-lspawn.c
index fed5c4c..894bb2a 100644
--- a/src/qmail-lspawn.c
+++ b/src/qmail-lspawn.c
@@ -41,17 +41,17 @@ void report(buffer *log,int wstat,char *s,int len)
case QLX_NOALIAS:
buffer_putsflush(log,"Zqmail-lspawn: Unable to find alias user!\n"); return;
case QLX_ROOT:
- buffer_putsflush(log,"Zqmail-spawn: Not allowed to perform deliveries as root.\n"); return;
+ buffer_putsflush(log,"Zqmail-lspawn: Not allowed to perform deliveries as root.\n"); return;
case QLX_USAGE:
- buffer_putsflush(log,"Zqmail-spawn: Internal bug.\n"); return;
+ buffer_putsflush(log,"Zqmail-lspawn: Internal bug.\n"); return;
case QLX_NFS:
- buffer_putsflush(log,"Zqmail-spawn: NFS failure in qmail-local.\n"); return;
+ buffer_putsflush(log,"Zqmail-lspawn: NFS failure in qmail-local.\n"); return;
case QLX_EXECHARD:
- buffer_putsflush(log,"Dqmail-spawn: Unable to run qmail-local.\n"); return;
+ buffer_putsflush(log,"Dqmail-lspawn: Unable to run qmail-local.\n"); return;
case QLX_EXECSOFT:
- buffer_putsflush(log,"Zqmail-spawn: Unable to run qmail-local.\n"); return;
+ buffer_putsflush(log,"Zqmail-lspawn: Unable to run qmail-local.\n"); return;
case QLX_EXECPW:
- buffer_putsflush(log,"Zqmail-spawn: Unable to run qmail-getpw.\n"); return;
+ buffer_putsflush(log,"Zqmail-lspawn: Unable to run qmail-getpw.\n"); return;
case 111: case 71: case 74: case 75:
buffer_put(log,"Z",1); break;
case 0:
diff --git a/src/qmail-qmaint.c b/src/qmail-qmaint.c
index 02304e7..2539e78 100644
--- a/src/qmail-qmaint.c
+++ b/src/qmail-qmaint.c
@@ -19,7 +19,7 @@
#include "readsubdir.h"
#include "logmsg.h"
#include "exit.h"
-#include "auto_qmail.h"
+#include "auto_queue.h"
#include "auto_split.h"
#include "auto_uids.h"
#include "datetime.h"
@@ -128,9 +128,9 @@ int check_item(char *name,int uid,int gid,int perm,char type,int size)
/*check for existence and proper credentials*/
- strnum[fmt_ulong(unum,uid)] = 0;
- strnum[fmt_ulong(gnum,gid)] = 0;
- strnum[fmt_ulong(pnum,perm)] = 0;
+ strnum[fmt_uint(unum,uid)] = 0;
+ strnum[fmt_uint(gnum,gid)] = 0;
+ strnum[fmt_uint(pnum,perm)] = 0;
switch (type) {
case 'd': /*directory*/
@@ -362,11 +362,9 @@ int cleanup_dkim()
direntry *d;
struct stat st;
int deleted = 0;
- unsigned long id;
- if (chdir(auto_qmail) == -1) err_chdir();
- if (chdir("queue") == -1) err_chdir();
- if (chdir("dkim") == -1) return 0;
+ if (chdir(auto_queue) == -1) err_chdir();
+ if (chdir("queue/dkim") == -1) return 0;
if (!stralloc_copy(&dkim_dir,&queue_dir)) die_nomem();
if (!stralloc_cats(&dkim_dir,"dkim/")) die_nomem();
@@ -475,12 +473,11 @@ int fix_names()
int check_dirs()
{
- /*check root existence*/
+ /*check queue existence*/
if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1;
- /*check the bigtodo queue */
if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
if (!stralloc_cats(&check_dir,"info")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
@@ -511,12 +508,14 @@ int check_dirs()
if (check_item(check_dir.s,qmailq_uid,qmail_gid,0700,'d',0)) return -1;
if (check_splits(check_dir.s,qmailq_uid,qmail_gid,0700,qmail_gid,0600)) return -1;
+ /*check the bigtodo queue */
if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
if (!stralloc_cats(&check_dir,"todo")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1;
if (check_splits(check_dir.s,qmailq_uid,qmail_gid,0750,-1,0644)) return -1;
+ /*check the dkim staging area */
if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
if (!stralloc_cats(&check_dir,"dkim")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
@@ -537,7 +536,7 @@ int check_dirs()
warn_files(check_dir.s);
- /*lock has special files that must exist*/
+ /* lock has special files that must exist */
if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
if (!stralloc_cats(&check_dir,"lock")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
@@ -585,8 +584,9 @@ int delete_msg(unsigned long id)
struct stat st;
int bounce = 1;
- if (chdir(auto_qmail) == -1) err_chdir();
+ if (chdir(auto_queue) == -1) err_chdir();
if (chdir("queue") == -1) err_chdir();
+
fnmake_init();
fnmake_mess(id); // regular message pre-processed
@@ -641,10 +641,10 @@ int main(int argc, char **argv)
logmsg(WHO,111,USAGE,"qmail-qmaint [-i] || [-d messid] || [-D]");
}
- if (!stralloc_copys(&queue_dir,auto_qmail)) die_nomem();
+ if (!stralloc_copys(&queue_dir,auto_queue)) die_nomem();
if (!stralloc_cats(&queue_dir,"/queue/")) die_nomem();
- logmsg(WHO,0,INFO,B("Checking s/qmail queue at: ",auto_qmail,"/queue/"));
+ logmsg(WHO,0,INFO,B("Checking s/qmail queue at: ",auto_queue,"/queue/"));
/* get constants */
diff --git a/src/qmail-qmtpd.c b/src/qmail-qmtpd.c
index f2a49cb..6478e21 100644
--- a/src/qmail-qmtpd.c
+++ b/src/qmail-qmtpd.c
@@ -18,7 +18,7 @@
#include "byte.h"
#define PORT_QMTPS "6209" // string compare
-#define QMTP_SIZE 200000000 // 23 MB transfer limit
+#define QMTP_SIZE 200000000 // 190 MB transfer limit
#define QMTP_TIMEOUT 3600 // 1 hour
/** @file qmail-qmtpd.c -- QMTP/QMTPS server
@@ -75,7 +75,7 @@ unsigned int bytestooverflow = 0;
struct qmail qq;
char buf[BUFSIZE_LINE]; // sender/recipient buffer
-char bufd[BUFSIZE_MESS]; // temporary data buffer
+char bufd[2 * BUFSIZE_MESS]; // temporary data buffer
char buf2[BUFFER_SMALL]; // QMTP message buffer
char *remotehost;
diff --git a/src/qmail-qread.c b/src/qmail-qread.c
index 664bde2..379ac67 100644
--- a/src/qmail-qread.c
+++ b/src/qmail-qread.c
@@ -7,7 +7,7 @@
#include "getln.h"
#include "fmtqfn.h"
#include "readsubdir.h"
-#include "auto_qmail.h"
+#include "auto_queue.h"
#include "open.h"
#include "datetime.h"
#include "date822fmt.h"
@@ -110,7 +110,7 @@ int main()
buffer b;
int x;
- if (chdir(auto_qmail) == -1) die_chdir();
+ if (chdir(auto_queue) == -1) die_chdir();
if (chdir("queue") == -1) die_chdir();
readsubdir_init(&rs,"info",die_opendir);
diff --git a/src/qmail-queue.c b/src/qmail-queue.c
index 250d556..57f1224 100644
--- a/src/qmail-queue.c
+++ b/src/qmail-queue.c
@@ -14,6 +14,7 @@
#include "triggerpull.h"
#include "extra.h"
#include "auto_qmail.h"
+#include "auto_queue.h"
#include "auto_uids.h"
#include "date822fmt.h"
#include "fmtqfn.h"
@@ -210,7 +211,7 @@ int main()
sig_blocknone();
umask(033);
- if (chdir(auto_qmail) == -1) die(61);
+ if (chdir(auto_queue) == -1) die(62);
if (chdir("queue") == -1) die(62);
mypid = getpid();
diff --git a/src/qmail-remote.c b/src/qmail-remote.c
index fc90cd4..a6ef155 100644
--- a/src/qmail-remote.c
+++ b/src/qmail-remote.c
@@ -474,14 +474,14 @@ void tls_init()
temp_tlserr();
}
-int starttls_peer()
+int ehlo_starttls()
{
int i = 0;
- while ((i += str_chr(smtptext.s + i,'\n') + 1) &&
- (i + 8 < smtptext.len) ) {
- if (!str_diffn(smtptext.s + i + 4,"STARTTLS",8)) return 1;
- }
+ do {
+ if (case_startb(smtptext.s + i + 4,8,"STARTTLS")) return 1;
+ } while ((i += str_chr(smtptext.s + i,'\n') + 1) &&
+ (i < smtptext.len - 12));
return 0;
}
@@ -595,14 +595,14 @@ int utf8received()
unsigned long code;
int flagsize = 0;
-int smtp_size()
+int ehlo_size()
{
- int i;
+ int i = 0;
- while ((i += str_chr(smtptext.s + i,'\n') + 1) &&
- (i + 8 <= smtptext.len) ) {
- if (!str_diffn(smtptext.s + i + 4,"SIZE",4)) return 1;
- }
+ do {
+ if (case_startb(smtptext.s + i + 4,4,"SIZE")) return 1;
+ } while ((i += str_chr(smtptext.s + i,'\n') + 1) &&
+ (i < smtptext.len - 8));
return 0;;
}
@@ -625,7 +625,7 @@ void smtp_greeting()
if (code >= 500) quit("DConnected to "," but my name was rejected");
if (code != 250) quit("ZConnected to "," but my name was rejected");
}
- flagsize = smtp_size();
+ flagsize = ehlo_size();
}
void smtp_starttls()
@@ -813,21 +813,22 @@ int mailfrom_cram()
return 0;
}
-void smtp_auth()
+void ehlo_auth()
{
- int i;
+ int i = 0;
- while ((i += str_chr(smtptext.s + i,'\n') + 1) &&
- (i + 8 < smtptext.len) ) {
- if (!case_diffb(smtptext.s + i + 4,"AUTH",4)) {
- if (case_starts(smtptext.s + i + 9,"CRAM"))
- if (mailfrom_cram() >= 0) return;
- if (case_starts(smtptext.s + i + 9,"LOGIN"))
- if (mailfrom_login() >= 0) return;
- if (case_starts(smtptext.s + i + 9,"PLAIN"))
- if (mailfrom_plain() >= 0) return;
- }
- }
+ do {
+ if (case_startb(smtptext.s + i + 4,4,"AUTH"))
+ for (i = 4; i < smtptext.len - 5; ++i) {
+ if (case_startb(smtptext.s + i,4,"CRAM"))
+ if (mailfrom_cram() >= 0) return;
+ if (case_startb(smtptext.s + i,5,"LOGIN"))
+ if (mailfrom_login() >= 0) return;
+ if (case_startb(smtptext.s + i,5,"PLAIN"))
+ if (mailfrom_plain() >= 0) return;
+ }
+ } while ((i += str_chr(smtptext.s + i,'\n') + 1) &&
+ (i < smtptext.len - 12));
err_authprot();
mailfrom();
@@ -854,7 +855,7 @@ void smtp()
smtp_greeting();
if (flagtls > 0 && flagtls < 10) { /* STARTTLS */
- if (starttls_peer())
+ if (ehlo_starttls())
smtp_starttls();
else if (flagtls > 3 && flagtls != 9) {
if (!stralloc_0(&host)) temp_nomem();
@@ -862,7 +863,7 @@ void smtp()
}
}
if (user.len && pass.len) /* AUTH */
- smtp_auth();
+ ehlo_auth();
else
mailfrom(); /* Mail From */
@@ -1226,8 +1227,8 @@ int main(int argc,char **argv)
qmtpsend = 1; port = PORT_QMTP;
break;
} /* default smtproutes */
- if ((relayhost = constmap(&mapsmtproutes,host.s + i,host.len - i)))
- break;
+ if ((relayhost = constmap(&mapsmtproutes,host.s + i,host.len - i)))
+ break;
}
}
if (relayhost && !*relayhost) relayhost = 0;
diff --git a/src/qmail-rspawn.c b/src/qmail-rspawn.c
index a9b0a1a..b0e5bf0 100644
--- a/src/qmail-rspawn.c
+++ b/src/qmail-rspawn.c
@@ -8,6 +8,7 @@
#include "ipalloc.h"
#include "tcpto.h"
#include "auto_qmail.h"
+#include "auto_queue.h"
#include "open.h"
#include "pathexec.h"
@@ -27,7 +28,7 @@ void report(buffer *log,int wstat,char *s,int len)
switch (wait_exitcode(wstat)) {
case 0: break;
case 111: buffer_putsflush(log,"Zqmail-rspawn: Unable to run qmail-remote.\n"); break;
- default: buffer_putsflush(log,"Dqmail-rspawn: Unable to run qmail-remote. \n"); return;
+ default: buffer_putsflush(log,"Dqmail-rspawn: Unable to run qmail-remote.\n"); return;
}
if (!len) { buffer_putsflush(log,"Zqmail-rspawn: qmail-remote produced no output.\n"); return; }
@@ -75,8 +76,8 @@ int spawn(int fdmess,int fdout,const char *s,char *r,const int at)
char *(args[5]);
struct stat st;
- if (chdir(auto_qmail) == -1) _exit(110);
- if (stat("control/dkimdomains",&st) !=1)
+ if (chdir(auto_qmail) == -1) _exit(61);
+ if (!stat("control/dkimdomains",&st))
args[0] = "qmail-dksign";
else
args[0] = "qmail-remote";
@@ -85,12 +86,13 @@ int spawn(int fdmess,int fdout,const char *s,char *r,const int at)
args[3] = r;
args[4] = 0;
- if (chdir("queue/mess") == -1) _exit(110);
+ if (chdir(auto_queue) == -1) _exit(62);
+ if (chdir("queue/mess") == -1) _exit(62);
if (!(f = vfork())) {
- if (fd_move(0,fdmess) == -1) _exit(111);
- if (fd_move(1,fdout) == -1) _exit(111);
- if (fd_copy(2,1) == -1) _exit(111);
+ if (fd_move(0,fdmess) == -1) _exit(63);
+ if (fd_move(1,fdout) == -1) _exit(63);
+ if (fd_copy(2,1) == -1) _exit(63);
pathexec(args);
if (errno) _exit(111);
_exit(100);
diff --git a/src/qmail-send.c b/src/qmail-send.c
index 026161f..e8b9de6 100644
--- a/src/qmail-send.c
+++ b/src/qmail-send.c
@@ -26,6 +26,7 @@
#include "scan.h"
#include "case.h"
#include "auto_qmail.h"
+#include "auto_queue.h"
#include "trigger.h"
#include "newfield.h"
#include "quote.h"
@@ -40,6 +41,8 @@
int lifetime = 604800;
int bouncemaxbytes = 0;
+stralloc queuedir = {0};
+
stralloc percenthack = {0};
struct constmap mappercenthack;
stralloc locals = {0};
@@ -69,7 +72,7 @@ int flagreadasap = 0; void sighup() { flagreadasap = 1; }
void cleandied()
{
- log1s("alert: lost connection to qmail-clean ... exiting\n");
+ log1s("alert: qmail-send lost connection to qmail-clean ... exiting\n");
flagexitasap = 1;
}
@@ -77,7 +80,7 @@ int flagspawnalive[CHANNELS];
void spawndied(int c)
{
- log1s("alert: oh no! lost spawn connection! dying...\n");
+ log1s("alert: oh no! qmail-send lost spawn connection! dying...\n");
flagspawnalive[c] = 0;
flagexitasap = 1;
}
@@ -302,7 +305,7 @@ void cleanup_do()
if (buffer_putflush(&toqc,fn.s,fn.len) == -1) { cleandied(); return; }
if (buffer_get(&fromqc,&ch,1) != 1) { cleandied(); return; }
if (ch != '+')
- log3s("warning: qmail-clean unable to clean up ",fn.s,"\n");
+ log3s("warning: qmail-clean is unable to clean up ",fn.s,"\n");
}
@@ -355,7 +358,7 @@ void pqadd(unsigned long id)
return;
FAIL:
- log3s("warning: unable to stat ",fn.s,"; will try again later\n");
+ log3s("warning: qmail-send send is unable to stat ",fn.s,"; will try again later\n");
pe.id = id; pe.dt = now() + SLEEP_SYSFAIL;
while (!prioq_insert(&pqfail,&pe)) nomem();
}
@@ -384,7 +387,7 @@ void pqfinish()
fnmake_chanaddr(pe.id,c);
ut[0] = ut[1] = pe.dt;
if (utime(fn.s,ut) == -1)
- log3s("warning: unable to utime ",fn.s,"; message will be retried too soon\n");
+ log3s("warning: qmail-send is unable to utime ",fn.s,"; message will be retried too soon\n");
}
}
@@ -467,16 +470,16 @@ void job_close(int j)
if (jo[j].flaghiteof && !jo[j].numtodo) {
fnmake_chanaddr(jo[j].id,jo[j].channel);
if (unlink(fn.s) == -1) {
- log3s("warning: unable to unlink ",fn.s,"; will try again later\n");
+ log3s("warning: qmail-send is unable to unlink ",fn.s,"; will try again later\n");
pe.dt = now() + SLEEP_SYSFAIL;
} else {
for (c = 0; c < CHANNELS; ++c) if (c != jo[j].channel) {
fnmake_chanaddr(jo[j].id,c);
if (stat(fn.s,&st) == 0) return; /* more channels going */
if (errno != ENOENT) {
- log3s("warning: unable to stat ",fn.s,"\n");
- break; /* this is the only reason for HOPEFULLY */
- }
+ log3s("warning: qmail-send is unable to stat ",fn.s,"\n");
+ break; /* this is the only reason for HOPEFULLY */
+ }
}
pe.dt = now();
while (!prioq_insert(&pqdone,&pe)) nomem();
@@ -548,7 +551,7 @@ void addbounce(unsigned long id,char *recip,char *report)
for (;;) {
fd = open_append(fn2.s);
if (fd != -1) break;
- log1s("alert: unable to append to bounce message; HELP! sleeping...\n");
+ log1s("alert: qmail-send is unable to append to bounce message; HELP! sleeping...\n");
sleep(10);
}
@@ -557,7 +560,7 @@ void addbounce(unsigned long id,char *recip,char *report)
while (pos < bouncetext.len) {
w = write(fd,bouncetext.s + pos,bouncetext.len - pos);
if (w <= 0) {
- log1s("alert: unable to append to bounce message; HELP! sleeping...\n");
+ log1s("alert: qmail-send is unable to append to bounce message; HELP! sleeping...\n");
sleep(10);
}
else
@@ -598,7 +601,7 @@ int injectbounce(unsigned long id)
if (stat(fn2.s,&st) == -1) {
if (errno == ENOENT) return 1;
- log3s("warning: unable to stat ",fn2.s,"\n");
+ log3s("warning: qmail-send is unable to stat ",fn2.s,"\n");
return 0;
}
@@ -608,7 +611,7 @@ int injectbounce(unsigned long id)
log3s("double bounce: discarding ",fn2.s,"\n");
else {
if (qmail_open(&qqt) == -1)
- { log1s("warning: unable to start qmail-queue, will try later\n"); return 0; }
+ { log1s("warning: qmail-send is unable to start qmail-queue, will try later\n"); return 0; }
qp = qmail_qp(&qqt);
if (*sender.s) { bouncesender = ""; bouncerecip = sender.s; }
@@ -673,21 +676,21 @@ I tried to deliver a bounce message to this address, but the bounce bounced!\n\
}
if (r > 0)
qmail_puts(&qqt,"\n\n--- Rest of message truncated.\n");
- } else { /* preserve default behavior */
+ } else { /* preserve default behavior */
buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
while ((r = buffer_get(&bi,buf,sizeof(buf))) > 0)
qmail_put(&qqt,buf,r);
- }
- close(fd);
- if (r == -1) qmail_fail(&qqt);
+ }
+ close(fd);
+ if (r == -1) qmail_fail(&qqt);
}
qmail_from(&qqt,bouncesender);
qmail_to(&qqt,bouncerecip);
if (*qmail_close(&qqt)) {
- log1s("warning: trouble injecting bounce message, will try later\n");
+ log1s("warning: qmail-send has trouble injecting bounce message, will try later\n");
return 0;
}
@@ -698,7 +701,7 @@ I tried to deliver a bounce message to this address, but the bounce bounced!\n\
}
if (unlink(fn2.s) != 0) {
- log3s("warning: unable to unlink ",fn2.s,"\n");
+ log3s("warning: qmail-send is unable to unlink ",fn2.s,"\n");
return 0;
}
@@ -819,7 +822,7 @@ void markdone(int c,unsigned long id,seek_pos pos)
close(fd);
return;
}
- log3s("warning: trouble marking ",fn.s,"; message will be delivered twice!\n");
+ log3s("warning: qmail-send has trouble marking ",fn.s,"; message will be delivered twice!\n");
}
void del_dochan(int c)
@@ -845,7 +848,7 @@ void del_dochan(int c)
if (!ch && (dline[c].len > 1)) {
delnum = (unsigned int) (unsigned char) dline[c].s[0];
if ((delnum < 0) || (delnum >= concurrency[c]) || !d[c][delnum].used)
- log1s("warning: internal error: delivery report out of range\n");
+ log1s("warning: qmail-send's internal error: delivery report out of range\n");
else {
strnum3[fmt_ulong(strnum3,d[c][delnum].delid)] = 0;
if (dline[c].s[1] == 'Z')
@@ -1017,7 +1020,7 @@ void pass_dochan(int c)
if (getln(&pass[c].b,&line,&match,'\0') == -1) {
fnmake_chanaddr(pass[c].id,c);
- log3s("warning: trouble reading ",fn.s,"; will try again later\n");
+ log3s("warning: qmail-send has trouble reading ",fn.s,"; will try again later\n");
close(pass[c].fd);
job_close(pass[c].j);
pass[c].id = 0;
@@ -1041,7 +1044,7 @@ void pass_dochan(int c)
break;
default:
fnmake_chanaddr(pass[c].id,c);
- log3s("warning: unknown record type in ",fn.s,"!\n");
+ log3s("warning: qmail-send recognizes unknown record type in ",fn.s,"!\n");
close(pass[c].fd);
job_close(pass[c].j);
pass[c].id = 0;
@@ -1052,7 +1055,7 @@ void pass_dochan(int c)
return;
trouble:
- log3s("warning: trouble opening ",fn.s,"; will try again later\n");
+ log3s("warning: qmail-send has trouble opening ",fn.s,"; will try again later\n");
pe.dt = recent + SLEEP_SYSFAIL;
while (!prioq_insert(&pqchan[c],&pe)) nomem();
}
@@ -1068,7 +1071,7 @@ void messdone(unsigned long id)
fnmake_chanaddr(id,c);
if (stat(fn.s,&st) == 0) return; /* false alarm; consequence of HOPEFULLY */
if (errno != ENOENT) {
- log3s("warning: unable to stat ",fn.s,"; will try again later\n");
+ log3s("warning: qmail-send is unable to stat ",fn.s,"; will try again later\n");
goto FAIL;
}
}
@@ -1076,14 +1079,14 @@ void messdone(unsigned long id)
fnmake_todo(id);
if (stat(fn.s,&st) == 0) return;
if (errno != ENOENT) {
- log3s("warning: unable to stat ",fn.s,"; will try again later\n");
+ log3s("warning: qmail-send is unable to stat ",fn.s,"; will try again later\n");
goto FAIL;
}
fnmake_info(id);
if (stat(fn.s,&st) == -1) {
if (errno == ENOENT) return;
- log3s("warning: unable to stat ",fn.s,"; will try again later\n");
+ log3s("warning: qmail-send is unable to stat ",fn.s,"; will try again later\n");
goto FAIL;
}
@@ -1097,7 +1100,7 @@ void messdone(unsigned long id)
/* -todo +info -local -remote -bounce */
fnmake_info(id);
if (unlink(fn.s) == -1) {
- log3s("warning: unable to unlink ",fn.s,"; will try again later\n");
+ log3s("warning: qmail-send is unable to unlink ",fn.s,"; will try again later\n");
goto FAIL;
}
@@ -1145,7 +1148,7 @@ int todofdout;
int flagtodoalive;
void tododied() {
- log1s("alert: lost connection to qmail-todo ... exiting\n");
+ log1s("alert: qmail-send lost connection to qmail-todo ... exiting\n");
flagexitasap = 1;
flagtodoalive = 0;
}
@@ -1200,13 +1203,13 @@ void todo_del(char* s)
case 'X':
break;
default:
- log1s("warning: qmail-send unable to understand qmail-todo\n");
+ log1s("warning: qmail-send is unable to understand qmail-todo\n");
return;
}
len = scan_ulong(s,&id);
if (!len || s[len]) {
- log1s("warning: qmail-send unable to understand qmail-todo\n");
+ log1s("warning: qmail-send is unable to understand qmail-todo\n");
return;
}
@@ -1265,7 +1268,7 @@ void todo_do(fd_set *rfds)
tododied();
break;
default:
- log1s("warning: qmail-send unable to understand qmail-todo: report mangled\n");
+ log1s("warning: qmail-send is unable to understand qmail-todo: report mangled\n");
break;
}
todoline.len = 0;
@@ -1312,13 +1315,13 @@ void regetcontrols()
{
int r;
- if (control_readfile(&newlocals,"control/locals",1) != 1) { log1s("alert: unable to reread control/locals\n"); return; }
- if (control_readint(&concurrency[0],"control/concurrencylocal") == -1) { log1s("alert: unable to reread control/concurrencylocal\n"); return; }
- if (control_readint(&concurrency[1],"control/concurrencyremote") == -1) { log1s("alert: unable to reread control/concurrencyremote\n"); return; }
- if (control_readint(&lifetime,"control/queuelifetime") == -1) { log1s("alert: unable to reread control/queuelifetime\n"); return; }
+ if (control_readfile(&newlocals,"control/locals",1) != 1) { log1s("alert: qmail-send is unable to reread control/locals\n"); return; }
+ if (control_readint(&concurrency[0],"control/concurrencylocal") == -1) { log1s("alert: qmail-send is unable to reread control/concurrencylocal\n"); return; }
+ if (control_readint(&concurrency[1],"control/concurrencyremote") == -1) { log1s("alert: qmail-send is unable to reread control/concurrencyremote\n"); return; }
+ if (control_readint(&lifetime,"control/queuelifetime") == -1) { log1s("alert: qmail-send is unable to reread control/queuelifetime\n"); return; }
r = control_readfile(&newvdoms,"control/virtualdomains",0);
- if (r == -1) { log1s("alert: unable to reread control/virtualdomains\n"); return; }
+ if (r == -1) { log1s("alert: qmail-send is unable to reread control/virtualdomains\n"); return; }
constmap_free(&maplocals);
constmap_free(&mapvdoms);
@@ -1336,14 +1339,14 @@ void regetcontrols()
void reread()
{
if (chdir(auto_qmail) == -1) {
- log1s("alert: unable to reread controls: unable to switch to home directory\n");
+ log1s("alert: qmail-send is unable to reread controls: unable to switch to home directory\n");
return;
}
write(todofdout,"H",1);
regetcontrols();
- while (chdir("queue") == -1) {
- log1s("alert: unable to switch back to queue directory; HELP! sleeping...\n");
+ while (chdir(queuedir.s) == -1) {
+ log1s("alert: qmail-send is unable to switch back to queue directory; HELP! sleeping...\n");
sleep(10);
}
}
@@ -1360,10 +1363,14 @@ int main()
int u;
int r;
char ch;
+
+ if (!stralloc_copys(&queuedir,auto_queue)) _exit(110);
+ if (!stralloc_cats(&queuedir,"/queue")) _exit(110);
+ if (!stralloc_0(&queuedir)) _exit(110);
- if (chdir(auto_qmail) == -1) { log1s("alert: cannot start: unable to switch to home directory\n"); _exit(110); }
- if (!getcontrols()) { log1s("alert: cannot start: unable to read controls\n"); _exit(111); }
- if (chdir("queue") == -1) { log1s("alert: cannot start: unable to switch to queue directory\n"); _exit(110); }
+ if (chdir(auto_qmail) == -1) { log3s("alert: qmail-send is unable to switch to home directory ",auto_qmail,"\n"); _exit(110); }
+ if (!getcontrols()) { log1s("alert: qmail-send is unable to read controls\n"); _exit(111); }
+ if (chdir(queuedir.s) == -1) { log3s("alert: qmail-send cannot start and is unable to switch to queue directory ",queuedir.s,"\n"); _exit(110); }
sig_pipeignore();
sig_termcatch(sigterm);
sig_alarmcatch(sigalrm);
@@ -1372,8 +1379,8 @@ int main()
umask(077);
fd = open_write("lock/sendmutex");
- if (fd == -1) { log1s("alert: cannot start: unable to open mutex\n"); _exit(111); }
- if (lock_exnb(fd) == -1) { log1s("alert: cannot start: qmail-send is already running\n"); _exit(111); }
+ if (fd == -1) { log1s("alert: qmail-send is unable to open mutex\n"); _exit(111); }
+ if (lock_exnb(fd) == -1) { log1s("alert: qmail-send is already running\n"); _exit(111); }
numjobs = 0;
for (c = 0;c < CHANNELS;++c) {
@@ -1424,7 +1431,7 @@ int main()
if (errno == EINTR)
;
else
- log1s("warning: trouble in select\n");
+ log1s("warning: qmail-send has trouble in select\n");
else {
recent = now();
@@ -1437,6 +1444,6 @@ int main()
}
pqfinish();
- log1s("status: exiting\n");
+ log1s("status: qmail-send exiting\n");
_exit(0);
}
diff --git a/src/qmail-smtpam.c b/src/qmail-smtpam.c
index f5247dc..0cb8b3b 100644
--- a/src/qmail-smtpam.c
+++ b/src/qmail-smtpam.c
@@ -325,13 +325,14 @@ void tls_init()
temp_tlserr();
}
-int starttls_peer()
+int ehlo_starttls()
{
int i = 0;
- while ( (i += str_chr(smtptext.s + i,'\n') + 1) &&
- (i < smtptext.len - 8) ) {
- if (!str_diffn(smtptext.s + i + 4,"STARTTLS",8)) return 1; }
+ do {
+ if (case_starts(smtptext.s + i + 4,"STARTTLS")) return 1;
+ } while ((i += str_chr(smtptext.s + i,'\n') + 1) &&
+ (i - 12 < smtptext.len));
return 0;
}
@@ -430,7 +431,7 @@ void smtp()
if (flagutf8mail) buffer_puts(&bo," SMTPUTF8");
if (flagtls > 0 && flagtls < 10) /* STARTTLS */
- if (starttls_peer()) {
+ if (ehlo_starttls()) {
smtp_starttls();
} else if (flagtls > 2) {
temp_tlshost();
diff --git a/src/qmail-smtpd.c b/src/qmail-smtpd.c
index 3ca302c..f01cbee 100644
--- a/src/qmail-smtpd.c
+++ b/src/qmail-smtpd.c
@@ -677,7 +677,7 @@ int bmfcheck()
if (!stralloc_append(&eddr,"=")) die_nomem();
if (!stralloc_0(&eddr)) die_nomem();
case_lowerb(eddr.s,eddr.len);
- if (case_diffb(remotehost + rlen - dlen,eddr.s + at + 1,dlen))
+ if (case_diffb(remotehost + rlen - dlen,dlen,eddr.s + at + 1))
if (constmap(&mapbmf,eddr.s + at,eddr.len - at - 1)) return -3;
/* '~' extended address for MISMATCHED Domains */
@@ -795,10 +795,9 @@ int localaddr(char *mf)
return mfrules(fdmav,remoteip,remotehost,remoteinfo,mf);
else {
if (str_len(localmfcheck) > 1) {
- case_lowerb(localmfcheck,str_len(localmfcheck));
at = byte_rchr(mf,mflen,'@');
if (at < mflen)
- if (!case_diffb(localmfcheck,mf + at + 1,mflen - at - 1)) return 2;
+ if (!case_diffb(localmfcheck,mflen - at - 1,mf + at + 1)) return 2;
}
if (addrallowed(mf)) return 3;
return -2;
@@ -992,11 +991,11 @@ void smtp_mail(char *arg)
if (!stralloc_0(&protocol)) die_nomem();
if ((starttls > 1) && !seentls) {
- err_tlsreq("Reject::TLS::missing",protocol.s,remoteip,remotehost,helohost.s);
+ err_tlsreq("Reject::TLS::Missing",protocol.s,remoteip,remotehost,helohost.s);
return;
}
if (smtpauth > 10 && !seenauth) {
- err_authreq("Reject::AUTH::missing",protocol.s,remoteip,remotehost,helohost.s);
+ err_authreq("Reject::AUTH::Missing",protocol.s,remoteip,remotehost,helohost.s);
return;
}
if (!addrparse(arg)) { err_syntax(); return; }
@@ -1626,20 +1625,20 @@ void smtp_auth(char *arg)
if ((starttls > 1) && !seentls) {
if (!stralloc_append(&protocol,"A")) die_nomem();
if (!stralloc_0(&protocol)) die_nomem();
- err_authsetup("Reject::TLS::required",protocol.s,remoteip,remotehost,helohost.s);
+ err_authsetup("Reject::TLS::Required",protocol.s,remoteip,remotehost,helohost.s);
return;
}
if ((starttls > 1) && !seenhelo) {
if (!stralloc_append(&protocol,"A")) die_nomem();
if (!stralloc_0(&protocol)) die_nomem();
- err_tlsreq("Reject::AUTH::invalid",protocol.s,remoteip,remotehost,helohost.s);
+ err_tlsreq("Reject::AUTH::Invalid",protocol.s,remoteip,remotehost,helohost.s);
return;
}
if (!smtpauth) { out("503 auth not available (#5.3.3)\r\n"); flush(); _exit(0); }
if (smtpauth && !*childargs) {
- err_authsetup("Reject::AUTH::setup",protocol.s,remoteip,remotehost,helohost.s);
+ err_authsetup("Reject::AUTH::Setup",protocol.s,remoteip,remotehost,helohost.s);
flush(); _exit(1);
}
if (seenauth) { err_authd(); return; }
diff --git a/src/qmail-start.c b/src/qmail-start.c
index 4ff0f23..d1aae7a 100644
--- a/src/qmail-start.c
+++ b/src/qmail-start.c
@@ -55,7 +55,7 @@ int main(int argc,char **argv)
if (fd_copy(8,0) == -1) die();
if (argv[1]) {
- qlargs[1] = argv[1]; // Mailbox or Maildir
+ qlargs[1] = argv[1]; // defaultdelivery
++argv;
}
@@ -107,7 +107,7 @@ int main(int argc,char **argv)
if (fd_copy(1,pi4[1]) == -1) die();
closefds();
closepipes();
- execvp(*qrargs,qrargs); // qmail-respawn
+ execvp(*qrargs,qrargs); // qmail-rspawn
die();
}
@@ -133,7 +133,7 @@ int main(int argc,char **argv)
if (fd_copy(2,pi9[1]) == -1) die();
if (fd_copy(3,pi10[0]) == -1) die();
closepipes();
- execvp(*qtargs,qtargs); // qmail-todo
+ execvp(*qtargs,qtargs); // qmail-todo
die();
}
@@ -145,7 +145,7 @@ int main(int argc,char **argv)
if (fd_copy(1,pi10[1]) == -1) die();
closefds();
closepipes();
- execvp(*qcargs,qcargs); // qmail-clean
+ execvp(*qcargs,qcargs); // qmail-clean
die();
}
@@ -160,6 +160,6 @@ int main(int argc,char **argv)
if (fd_copy(7,pi7[1]) == -1) die();
if (fd_copy(8,pi8[0]) == -1) die();
closepipes();
- execvp(*qsargs,qsargs); // qmail-send
+ execvp(*qsargs,qsargs); // qmail-send
die();
}
diff --git a/src/qmail-tcpok.c b/src/qmail-tcpok.c
index 9447844..0e79591 100644
--- a/src/qmail-tcpok.c
+++ b/src/qmail-tcpok.c
@@ -1,9 +1,9 @@
+#include <unistd.h>
#include "logmsg.h"
#include "buffer.h"
#include "lock.h"
#include "open.h"
-#include <unistd.h>
-#include "auto_qmail.h"
+#include "auto_queue.h"
#include "exit.h"
#include "qmail.h"
@@ -17,21 +17,23 @@ int main()
int fd;
int i;
- if (chdir(auto_qmail) == -1)
- logmsg(WHO,111,FATAL,B("unable to chdir to: ",auto_qmail));
- if (chdir("queue/lock") == -1)
- logmsg(WHO,111,FATAL,B("unable to chdir to ",auto_qmail,"/queue/lock: "));
+ if (chdir(auto_queue) == -1)
+ logmsg(WHO,111,FATAL,B("unable to chdir to: ",auto_queue));
+ if (chdir("queue") == -1)
+ logmsg(WHO,111,FATAL,B("unable to chdir to: ",auto_queue,"/queue"));
+ if (chdir("lock") == -1)
+ logmsg(WHO,111,FATAL,B("unable to chdir to ",auto_queue,"/queue/lock"));
fd = open_write("tcpto");
if (fd == -1)
- logmsg(WHO,111,FATAL,B("unable to write ",auto_qmail,"/queue/lock/tcpto: "));
+ logmsg(WHO,111,FATAL,B("unable to write ",auto_queue,"/queue/lock/tcpto"));
if (lock_ex(fd) == -1)
- logmsg(WHO,111,FATAL,B("unable to lock ",auto_qmail,"/queue/lock/tcpto: "));
+ logmsg(WHO,111,FATAL,B("unable to lock ",auto_queue,"/queue/lock/tcpto"));
buffer_init(&bo,write,fd,buf,sizeof(buf));
for (i = 0; i < sizeof(buf); ++i)
buffer_put(&bo,"",1);
if (buffer_flush(&bo) == -1)
- logmsg(WHO,111,FATAL,B("unable to clear ",auto_qmail,"/queue/lock/tcpto: "));
+ logmsg(WHO,111,FATAL,B("unable to clear ",auto_queue,"/queue/lock/tcpto"));
_exit(0);
}
diff --git a/src/qmail-tcpto.c b/src/qmail-tcpto.c
index c735479..67f66c0 100644
--- a/src/qmail-tcpto.c
+++ b/src/qmail-tcpto.c
@@ -3,7 +3,7 @@
#include <sys/socket.h>
#include <unistd.h>
#include "buffer.h"
-#include "auto_qmail.h"
+#include "auto_queue.h"
#include "fmt.h"
#include "ip.h"
#include "lock.h"
@@ -51,7 +51,7 @@ int main(void)
datetime_sec when;
datetime_sec start;
- if (chdir(auto_qmail) == -1) die_chdir();
+ if (chdir(auto_queue) == -1) die_chdir();
if (chdir("queue/lock") == -1) die_chdir();
fdlock = open_write("tcpto");
diff --git a/src/qmail-todo.c b/src/qmail-todo.c
index 0abb10e..09a5006 100644
--- a/src/qmail-todo.c
+++ b/src/qmail-todo.c
@@ -3,6 +3,7 @@
#include <unistd.h>
#include "alloc.h"
#include "auto_qmail.h"
+#include "auto_queue.h"
#include "byte.h"
#include "constmap.h"
#include "control.h"
@@ -27,6 +28,8 @@
#include "sendtodo.h"
#include "qmail.h"
+stralloc queuedir = {0};
+
stralloc percenthack = {0};
struct constmap mappercenthack;
stralloc locals = {0};
@@ -202,7 +205,7 @@ int comm_canwrite(void)
return 0;
}
-void comm_write(unsigned long id, int local, int remote)
+void comm_write(unsigned long id,int local,int remote)
{
int pos;
char *s;
@@ -225,7 +228,7 @@ void comm_write(unsigned long id, int local, int remote)
comm_buf.len = pos;
}
-void comm_info(unsigned long id, unsigned long size, char* from, unsigned long pid, unsigned long uid)
+void comm_info(unsigned long id,unsigned long size,char* from,unsigned long pid,unsigned long uid)
{
int pos;
int i;
@@ -400,26 +403,26 @@ void todo_do(fd_set *rfds)
fnmake_todo(id);
fd = open_read(fn.s);
- if (fd == -1) { sendlog3("warning: qmail-todo: unable to open ",fn.s,"\n"); return; }
+ if (fd == -1) { sendlog3("warning: qmail-todo is unable to open ",fn.s,"\n"); return; }
fnmake_mess(id);
/* just for the statistics */
if (stat(fn.s,&st) == -1)
- { sendlog3("warning: qmail-todo: unable to stat ",fn.s," for mess\n"); goto FAIL; }
+ { sendlog3("warning: qmail-todo is unable to stat ",fn.s," for mess\n"); goto FAIL; }
for (c = 0; c < CHANNELS; ++c) {
fnmake_chanaddr(id,c);
if (unlink(fn.s) == -1) if (errno != ENOENT)
- { sendlog3("warning: qmail-todo: unable to unlink ",fn.s," for mess\n"); goto FAIL; }
+ { sendlog3("warning: qmail-todo is unable to unlink ",fn.s," for mess\n"); goto FAIL; }
}
fnmake_info(id);
if (unlink(fn.s) == -1) if (errno != ENOENT)
- { sendlog3("warning: qmail-todo: unable to unlink ",fn.s," for info\n"); goto FAIL; }
+ { sendlog3("warning: qmail-todo is unable to unlink ",fn.s," for info\n"); goto FAIL; }
fdnumber = open_excl(fn.s);
if (fdnumber == -1)
- { sendlog3("warning: qmail-todo: unable to create ",fn.s," for info\n"); goto FAIL; }
+ { sendlog3("warning: qmail-todo unable to create ",fn.s," for info\n"); goto FAIL; }
strnum[fmt_ulong(strnum,id)] = 0;
sendlog3("new msg ",strnum,"\n");
@@ -437,7 +440,7 @@ void todo_do(fd_set *rfds)
if (getln(&bi,&todoline,&match,'\0') == -1) {
/* perhaps we're out of memory, perhaps an I/O error */
fnmake_todo(id);
- sendlog3("warning: qmail-todo: trouble reading ",fn.s,"\n"); goto FAIL;
+ sendlog3("warning: qmail-todo has trouble reading ",fn.s,"\n"); goto FAIL;
}
if (!match) break;
@@ -449,7 +452,7 @@ void todo_do(fd_set *rfds)
case 'F':
if (buffer_putflush(&bo,todoline.s,todoline.len) == -1) {
fnmake_info(id);
- sendlog3("warning: qmail-todo: trouble writing to ",fn.s," for todo\n"); goto FAIL;
+ sendlog3("warning: qmail-todo has trouble writing to ",fn.s," for todo\n"); goto FAIL;
}
comm_info(id,(unsigned long) st.st_size,todoline.s + 1,pid,uid);
break;
@@ -463,18 +466,18 @@ void todo_do(fd_set *rfds)
fnmake_chanaddr(id,c);
fdchan[c] = open_excl(fn.s);
if (fdchan[c] == -1)
- { sendlog3("warning: qmail-todo: unable to create ",fn.s," for delivery\n"); goto FAIL; }
+ { sendlog3("warning: qmail-todo is unable to create ",fn.s," for delivery\n"); goto FAIL; }
buffer_init(&bchan[c],write,fdchan[c],todobufchan[c],sizeof(todobufchan[c]));
flagchan[c] = 1;
}
if (buffer_put(&bchan[c],rwline.s,rwline.len) == -1) {
fnmake_chanaddr(id,c);
- sendlog3("warning: qmail-todo: trouble writing to ",fn.s," for delivery\n"); goto FAIL;
+ sendlog3("warning: qmail-todo has trouble writing to ",fn.s," for delivery\n"); goto FAIL;
}
break;
default:
fnmake_todo(id);
- sendlog3("warning: qmail-todo: unknown record type in ",fn.s,"\n"); goto FAIL;
+ sendlog3("warning: qmail-todo recognizes unknown record type in ",fn.s,"\n"); goto FAIL;
}
}
@@ -482,16 +485,16 @@ void todo_do(fd_set *rfds)
fnmake_info(id);
if (buffer_flush(&bo) == -1)
- { sendlog3("warning: qmail-todo: trouble writing to ",fn.s," for info\n"); goto FAIL; }
+ { sendlog3("warning: qmail-todo has trouble writing to ",fn.s," for info\n"); goto FAIL; }
if (fsync(fdnumber) == -1)
- { sendlog3("warning: qmail-todo: trouble fsyncing ",fn.s," for info\n"); goto FAIL; }
+ { sendlog3("warning: qmail-todo has trouble fsyncing ",fn.s," for info\n"); goto FAIL; }
close(fdnumber); fdnumber = -1;
for (c = 0; c < CHANNELS; ++c)
if (fdchan[c] != -1) {
fnmake_chanaddr(id,c);
- if (buffer_flush(&bchan[c]) == -1) { sendlog3("warning: qmail-todo: trouble writing to ",fn.s," in channel\n"); goto FAIL; }
- if (fsync(fdchan[c]) == -1) { sendlog3("warning: qmail-todo: trouble fsyncing ",fn.s," in channel\n"); goto FAIL; }
+ if (buffer_flush(&bchan[c]) == -1) { sendlog3("warning: qmail-todo has trouble writing to ",fn.s," in channel\n"); goto FAIL; }
+ if (fsync(fdchan[c]) == -1) { sendlog3("warning: qmail-todo has trouble fsyncing ",fn.s," in channel\n"); goto FAIL; }
close(fdchan[c]); fdchan[c] = -1;
}
@@ -543,10 +546,10 @@ void regetcontrols(void)
int r;
if (control_readfile(&newlocals,"control/locals",1) != 1)
- { sendlog1("alert: qmail-todo: unable to reread control/locals\n"); return; }
+ { sendlog1("alert: qmail-todo is unable to reread control/locals\n"); return; }
r = control_readfile(&newvdoms,"control/virtualdomains",0);
if (r == -1)
- { sendlog1("alert: qmail-todo: unable to reread control/virtualdomains\n"); return; }
+ { sendlog1("alert: qmail-todo is unable to reread control/virtualdomains\n"); return; }
constmap_free(&maplocals);
constmap_free(&mapvdoms);
@@ -565,13 +568,14 @@ void regetcontrols(void)
void reread(void)
{
if (chdir(auto_qmail) == -1) {
- sendlog1("alert: qmail-todo: unable to reread controls: unable to switch to home directory\n");
+ sendlog1("alert: qmail-todo is unable to reread controls: unable to switch to home directory\n");
return;
}
regetcontrols();
- while (chdir("queue") == -1) {
- sendlog1("alert: qmail-todo: unable to switch back to queue directory; HELP! sleeping...\n");
+
+ while (chdir(queuedir.s) == -1) {
+ sendlog1("alert: qmail-todo is unable to switch back to queue directory; HELP! sleeping...\n");
sleep(10);
}
}
@@ -586,12 +590,16 @@ int main()
int r;
char c;
+ if (!stralloc_copys(&queuedir,auto_queue)) _exit(110);
+ if (!stralloc_cats(&queuedir,"/queue")) _exit(110);
+ if (!stralloc_0(&queuedir)) _exit(110);
+
if (chdir(auto_qmail) == -1)
- { sendlog1("alert: qmail-todo: cannot start: unable to switch to home directory\n"); _exit(110); }
+ { sendlog1("alert: qmail-todo cannot start and switch to home directory\n"); _exit(110); }
if (!getcontrols())
- { sendlog1("alert: qmail-todo: cannot start: unable to read controls\n"); _exit(112); }
- if (chdir("queue") == -1)
- { sendlog1("alert: qmail-todo: cannot start: unable to switch to queue directory\n"); _exit(110); }
+ { sendlog1("alert: qmail-todo cannot start and read controls\n"); _exit(112); }
+ if (chdir(queuedir.s) == -1)
+ { sendlog1("alert: qmail-todo cannot start and switch to queue directory\n"); _exit(110); }
sig_pipeignore();
umask(077);
@@ -631,7 +639,7 @@ int main()
if (errno == EINTR)
;
else
- sendlog1("warning: qmail-todo: trouble in select\n");
+ sendlog1("warning: qmail-todo has trouble in select\n");
else {
recent = now();
diff --git a/src/recipients.c b/src/recipients.c
index 40d7ffe..ad222ee 100644
--- a/src/recipients.c
+++ b/src/recipients.c
@@ -176,7 +176,7 @@ int recipients_parse(char *rhost,int rlen,char *addr,char *rkey,int klen,char *v
if (k && rlen >= k)
if (!str_diffn(line.s,rhost + rlen - k - 1,k - 1)) seenhost = 3;
if (u && rlen >= u)
- if (!str_diffn(line.s,rhost + rlen - u - 2,u - 2)) seenhost = 4;
+ if (!str_diffn(line.s,rhost + rlen - u - 1,u - 1)) seenhost = 4;
}
if (!seenhost) /* pass-thru */
if (!str_diffn(line.s,"!*",2)) return 5;
@@ -190,19 +190,19 @@ int recipients_parse(char *rhost,int rlen,char *addr,char *rkey,int klen,char *v
if (r == 111) return r;
}
- if (u && u < line.len) /* qmail-users */
+ if (u && u < line.len) /* qmail-users */
if (seenhost || !str_diffn(line.s,"*",1)) {
fdrcps = open_read("users/assign.cdb");
if (fdrcps != -1) {
cdb_init(&cdb,fdrcps);
- r = cdb_find(&cdb,ukey,ulen - 2);
+ r = cdb_find(&cdb,ukey,ulen - 1);
cdb_free(&cdb);
close(fdrcps);
if (r) return 3;
}
}
- if (j && j < line.len) /* cdb */
+ if (j && j < line.len) /* cdb */
if (seenhost || !str_diffn(line.s,"*",1)) {
fdrcps = open_read(line.s + j + 1);
if (fdrcps != -1) {
@@ -265,9 +265,9 @@ int recipients(char *buf,int len)
case_lowerb(key.s,key.len);
case_lowerb(domain.s,domain.len);
- if (!stralloc_copys(&ukey,"!=")) return -2;
+ if (!stralloc_copys(&ukey,"!")) return -2;
if (!stralloc_cat(&ukey,&user)) return -2;
- if (!stralloc_0(&ukey)) return -2; /* \0\0 terminated */
+ if (!stralloc_0(&ukey)) return -2; /* \0 terminated */
case_lowerb(ukey.s,ukey.len);
diff --git a/src/spawn.c b/src/spawn.c
index f7f6f93..f987ac6 100644
--- a/src/spawn.c
+++ b/src/spawn.c
@@ -13,12 +13,13 @@
#include "fd.h"
#include "open.h"
#include "error.h"
-#include "auto_qmail.h"
+#include "auto_queue.h"
#include "auto_uids.h"
#include "auto_spawn.h"
#include "qmail.h"
#define BUF_COMMANDS 1024
+#define BUFSIZE_MINI 128
extern int truncreport;
extern int spawn();
@@ -201,7 +202,7 @@ int main(int argc,char **argv)
fd_set rfds;
int nfds;
- if (chdir(auto_qmail) == -1) _exit(110);
+ if (chdir(auto_queue) == -1) _exit(110);
if (chdir("queue/mess") == -1) _exit(110);
if (!stralloc_copys(&messid,"")) _exit(111);
if (!stralloc_copys(&sender,"")) _exit(111);
diff --git a/src/tcpto.c b/src/tcpto.c
index 82b102f..a600e59 100644
--- a/src/tcpto.c
+++ b/src/tcpto.c
@@ -10,20 +10,25 @@
#include "byte.h"
#include "datetime.h"
#include "qmail.h"
+#include "auto_qmail.h"
+#include "auto_queue.h"
char tcpto_buf[BUFSIZE_LINE];
static int flagwasthere;
static int fdlock;
+void die_home() { _exit(61); }
+void die_queue() { _exit(62); }
+
static int getbuf()
{
int r;
int fd;
- fdlock = open_write("queue/lock/tcpto");
+ fdlock = open_write("lock/tcpto");
if (fdlock == -1) return 0;
- fd = open_read("queue/lock/tcpto");
+ fd = open_read("lock/tcpto");
if (fd == -1) { close(fdlock); return 0; }
if (lock_ex(fdlock) == -1) { close(fdlock); close(fd); return 0; }
r = read(fd,tcpto_buf,sizeof(tcpto_buf));
@@ -43,6 +48,8 @@ int tcpto(struct ip_mx *ix)
char *record;
datetime_sec when;
+ if (chdir(auto_queue) == -1) die_queue();
+ if (chdir("queue") == -1) die_queue();
flagwasthere = 0;
n = getbuf();
@@ -66,6 +73,9 @@ int tcpto(struct ip_mx *ix)
}
record += 32;
}
+
+ if (chdir(auto_qmail) == -1) die_home();
+
return 0;
}
diff --git a/src/token822.c b/src/token822.c
index 239887c..663311f 100644
--- a/src/token822.c
+++ b/src/token822.c
@@ -105,7 +105,7 @@ int token822_unparse(stralloc *sa,token822_alloc *ta,unsigned int linelen)
case '\\': case '\r': case '\n': ++len;
default: ++len;
}
- break;
+ break;
}
}
len += 2;