From: Mark Wooding Date: Tue, 14 Feb 2006 15:55:38 +0000 (+0000) Subject: Merge branches 'idx/verh' and 'idx/qmqpc' X-Git-Tag: mdw/1.03-5~2 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/qmail/commitdiff_plain/3720dd680be25cf0322d9eccf49b0b504add4411?hp=6d2736c0746b752cae7148c8e1637ec6cc9f9c1c Merge branches 'idx/verh' and 'idx/qmqpc' * idx/verh: [PATCH] Rewrite ##X tags in headers of incoming messages * idx/qmqpc: [PATCH] qmqpc: Read servers from the command line. --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f4c3f19 --- /dev/null +++ b/.gitignore @@ -0,0 +1,169 @@ +addresses.0 +auto-ccld.sh +auto-gid +auto-int +auto-int8 +auto-str +auto-uid +auto_break.c +auto_patrn.c +auto_qmail.c +auto_spawn.c +auto_split.c +auto_uids.c +auto_usera.c +binm1 +binm1+df +binm2 +binm2+df +binm3 +binm3+df +bouncesaying +bouncesaying.0 +build +chkshsgr +chkspawn +compile +condredirect +condredirect.0 +config +config-fast +datemail +direntry.h +dns.lib +dnscname +dnsfq +dnsip +dnsmxip +dnsptr +dot-qmail.0 +dot-qmail.5 +elq +envelopes.0 +except +except.0 +find-systype +forgeries.0 +fork.h +forward +forward.0 +hasflock.h +hasmkffo.h +hasnpbg1.h +hassalen.h +hassgact.h +hassgprm.h +hasshsgr.h +haswaitp.h +home +home+df +hostname +idedit +install +install-big +instcheck +ipmeprint +load +maildir.0 +maildir2mbox +maildir2mbox.0 +maildirmake +maildirmake.0 +maildirwatch +maildirwatch.0 +mailsubj +mailsubj.0 +make-compile +make-load +make-makelib +makelib +mbox.0 +pinq +predate +preline +preline.0 +proc +proc+df +qail +qbiff +qbiff.0 +qmail-clean +qmail-clean.0 +qmail-command.0 +qmail-control.0 +qmail-control.5 +qmail-getpw +qmail-getpw.0 +qmail-getpw.8 +qmail-header.0 +qmail-inject +qmail-inject.0 +qmail-limits.0 +qmail-limits.7 +qmail-local +qmail-local.0 +qmail-log.0 +qmail-lspawn +qmail-lspawn.0 +qmail-newmrh +qmail-newmrh.0 +qmail-newmrh.8 +qmail-newu +qmail-newu.0 +qmail-newu.8 +qmail-pop3d +qmail-pop3d.0 +qmail-popup +qmail-popup.0 +qmail-pw2u +qmail-pw2u.0 +qmail-pw2u.8 +qmail-qmqpc +qmail-qmqpc.0 +qmail-qmqpd +qmail-qmqpd.0 +qmail-qmtpd +qmail-qmtpd.0 +qmail-qread +qmail-qread.0 +qmail-qstat +qmail-qstat.0 +qmail-queue +qmail-queue.0 +qmail-remote +qmail-remote.0 +qmail-rspawn +qmail-rspawn.0 +qmail-send +qmail-send.0 +qmail-send.8 +qmail-showctl +qmail-showctl.0 +qmail-smtpd +qmail-smtpd.0 +qmail-start +qmail-start.0 +qmail-start.8 +qmail-tcpok +qmail-tcpok.0 +qmail-tcpto +qmail-tcpto.0 +qmail-upq +qmail-users.0 +qmail-users.5 +qmail.0 +qreceipt +qreceipt.0 +qsmhook +select.h +sendmail +socket.lib +splogger +splogger.0 +syslog.lib +systype +tcp-env +tcp-env.0 +tcp-environ.0 +uint32.h +qmail-valid-addresses.0 diff --git a/Makefile b/Makefile index 9230887..f3d8ebd 100644 --- a/Makefile +++ b/Makefile @@ -935,7 +935,7 @@ preline.0 condredirect.0 bouncesaying.0 except.0 maildirmake.0 \ maildir2mbox.0 maildirwatch.0 qmail.0 qmail-limits.0 qmail-log.0 \ qmail-control.0 qmail-header.0 qmail-users.0 dot-qmail.0 \ qmail-command.0 tcp-environ.0 maildir.0 mbox.0 addresses.0 \ -envelopes.0 forgeries.0 +envelopes.0 forgeries.0 qmail-valid-addresses.0 mbox.0: \ mbox.5 @@ -1483,12 +1483,12 @@ 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 case.a ndelay.a getln.a wait.a seek.a fd.a sig.a open.a \ lock.a stralloc.a alloc.a substdio.a error.a str.a fs.a auto_qmail.o \ -auto_split.o +auto_split.o env.a ./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 case.a ndelay.a getln.a \ wait.a seek.a fd.a sig.a open.a lock.a stralloc.a alloc.a \ - substdio.a error.a str.a fs.a auto_qmail.o auto_split.o + substdio.a error.a str.a fs.a auto_qmail.o auto_split.o env.a qmail-send.0: \ qmail-send.8 @@ -1532,12 +1532,12 @@ auto_split.h ./compile qmail-showctl.c qmail-smtpd: \ -load qmail-smtpd.o rcpthosts.o commands.o timeoutread.o \ +load qmail-smtpd.o addrcheck.o rcpthosts.o commands.o timeoutread.o \ timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o received.o \ date822fmt.o now.o qmail.o cdb.a fd.a wait.a datetime.a getln.a \ open.a sig.a case.a env.a stralloc.a alloc.a substdio.a error.a str.a \ fs.a auto_qmail.o socket.lib - ./load qmail-smtpd rcpthosts.o commands.o timeoutread.o \ + ./load qmail-smtpd addrcheck.o rcpthosts.o commands.o timeoutread.o \ timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o \ received.o date822fmt.o now.o qmail.o cdb.a fd.a wait.a \ datetime.a getln.a open.a sig.a case.a env.a stralloc.a \ @@ -1553,9 +1553,13 @@ compile qmail-smtpd.c sig.h readwrite.h stralloc.h gen_alloc.h \ substdio.h alloc.h auto_qmail.h control.h received.h constmap.h \ error.h ipme.h ip.h ipalloc.h ip.h gen_alloc.h ip.h qmail.h \ substdio.h str.h fmt.h scan.h byte.h case.h env.h now.h datetime.h \ -exit.h rcpthosts.h timeoutread.h timeoutwrite.h commands.h +exit.h rcpthosts.h timeoutread.h timeoutwrite.h commands.h addrcheck.h ./compile qmail-smtpd.c +addrcheck.o: \ +compile addrcheck.c cdb.h stralloc.h byte.h str.h + ./compile addrcheck.c + qmail-start: \ load qmail-start.o prot.o fd.a auto_uids.o ./load qmail-start prot.o fd.a auto_uids.o @@ -1627,6 +1631,10 @@ qmail-users.9 conf-break conf-spawn | sed s}SPAWN}"`head -1 conf-spawn`"}g \ > qmail-users.5 +qmail-valid-addresses.0: \ +qmail-valid-addresses.8 + nroff -man qmail-valid-addresses.8 > qmail-valid-addresses.0 + qmail.0: \ qmail.7 nroff -man qmail.7 > qmail.0 diff --git a/TARGETS b/TARGETS index facdad7..175aab7 100644 --- a/TARGETS +++ b/TARGETS @@ -249,6 +249,7 @@ received.o qmail-qmqpd qmail-qmtpd.o rcpthosts.o +addrcheck.o qmail-qmtpd qmail-smtpd.o qmail-smtpd diff --git a/addrcheck.c b/addrcheck.c new file mode 100644 index 0000000..08d29b9 --- /dev/null +++ b/addrcheck.c @@ -0,0 +1,236 @@ +#include "cdb.h" +#include "stralloc.h" +#include "byte.h" +#include "str.h" +#include "addrcheck.h" +#include +#include + +/* #define DEBUG */ +#ifdef DEBUG +# define D(x) x +# include +# include +#else +# define D(x) +#endif + +#define STRALLOC_INIT { 0 } + +static int probe(int cdb, int prefix, const char *key, int len, + const char *suffix, const char **kp, uint32 *dlen) +{ + static stralloc k = STRALLOC_INIT; + char ch = prefix; + int rc; + + k.len = 0; + if (!stralloc_append(&k, &ch) || + !stralloc_catb(&k, key, len) || + (suffix && !stralloc_cats(&k, suffix)) || + !stralloc_0(&k)) + return (-1); + if (kp) *kp = k.s; + D( fprintf(stderr, "*** `%.*s' -> ", k.len, k.s); ) + rc = cdb_seek(cdb, k.s, k.len - 1, dlen); + D( if (rc == -1) + fprintf(stderr, "error: %s\n", strerror(errno)); + else if (rc == 0) + fprintf(stderr, "not found\n"); + else if (!*dlen) + fprintf(stderr, "empty\n"); + else { + int n = *dlen; + int nn; + char buf[256]; + off_t pos = lseek(cdb, 0, SEEK_CUR); + fprintf(stderr, "`"); + while (n) { + nn = sizeof(buf); if (nn > n) nn = n; + read(cdb, buf, nn); + fwrite(buf, 1, nn, stderr); + n -= nn; + } + fprintf(stderr, "'\n"); + lseek(cdb, pos, SEEK_SET); + } ) + return (rc); +} + +static int localprobe(int cdb, const char *sender, + const char *key, int len, + const char *suffix, const char *tail, int *rc) +{ + int err; + uint32 dlen; + char ch; + const char *k; + static stralloc u = STRALLOC_INIT; + static stralloc serv = STRALLOC_INIT; + int kid; + int n; + int wstat; + int p[2]; + + if ((err = probe(cdb, 'L', key, len, suffix, &k, &dlen)) < 0) + return (-1); + if (!err) { *rc = 0; return (0); } + if (!dlen) { errno = EINVAL; return (-1); } + if (read(cdb, &ch, 1) != 1) { errno = EIO; return (-1); } + if (ch == '?') { + u.len = 0; + if (!stralloc_ready(&u, dlen - 1)) return (-1); + if (read(cdb, u.s, dlen - 1) != dlen - 1) { errno = EIO; return (-1); } + u.len = dlen - 1; + serv.len = 0; + if (!stralloc_cats(&serv, "addrcheck:") || + !stralloc_cats(&serv, k + 1) || + !stralloc_0(&serv) || + !stralloc_0(&u)) + return (-1); + D( fprintf(stderr, "asking user:\n\ + user = %s; service = %s\n tail = %s; sender = %s\n\ + address = %s; key = %s\n", + u.s, serv.s, tail, sender, key, k + 1); ) + + if (pipe(p) || (kid = fork()) == -1) + return (-1); + if (!kid) { + dup2(p[1], 1); + close(p[0]); + close(p[1]); + execl("/usr/bin/userv", "/usr/bin/userv", + "-f", "stdin=/dev/null", + u.s, serv.s, + tail, sender, key, k + 1, + (char *)0); + _exit(127); + } + close(p[1]); + n = read(p[0], &ch, 1); + close(p[0]); + if (wait_pid(&wstat, kid) < 0) { return (-1); } + D( fprintf(stderr, "userv exited with status %d\n", wstat); ) + if (n != 1 || wstat) { errno = EAGAIN; return (-1); } + D( fprintf(stderr, "userv answer was `%c'\n", ch); ) + } else if (dlen != 1) { + errno = EIO; + return (-1); + } + *rc = ch; + return (1); +} + +static int local(int cdb, const char *l, int len, + const char *sender, int *rc) +{ + int code; + int err = 0; + int dash; + + if ((err = localprobe(cdb, sender, l, len, 0, l + len, &code)) != 0) + goto done; + + for (;;) { + dash = byte_rchr(l, len, '-'); + if (dash == len) break; + if ((err = localprobe(cdb, sender, + l, dash, "-default", l + dash + 1, &code)) != 0) + goto done; + len = dash; + } + *rc = 0; + return (0); + +done: + if (err >= 0) { + switch (code) { + case '+': *rc = 1; break; + case '-': *rc = 0; break; + default: errno = EINVAL; err = -1; break; + } + } + return (err); +} + +static int virt(int cdb, const char *u, int ulen, + const char *addr, int alen, const char *sender, int *rc) +{ + static stralloc l = STRALLOC_INIT; + uint32 dlen; + int err; + + if ((err = probe(cdb, 'V', addr, alen, 0, 0, &dlen)) <= 0) + return (err); + if (!stralloc_ready(&l, dlen + 1)) return (-1); + if (read(cdb, l.s, dlen) != dlen) { errno = EIO; return (-1); } + l.s[dlen] = '-'; + l.len = dlen + 1; + if (!stralloc_catb(&l, u, ulen) || !stralloc_0(&l)) return (-1); + D( printf("*** virtual map -> `%s'\n", l.s); ) + if (local(cdb, l.s, l.len - 1, sender, rc) < 0) return (-1); + return (1); +} + +int addrcheck(int cdb, const char *addr, const char *sender, int *rc) +{ + int at, len, dot; + int err = 0; + uint32 dlen; + + len = str_len(addr); + at = str_chr(addr, '@'); + if (!addr[at]) + return (local(cdb, addr, len, sender, rc)); + + if ((err = virt(cdb, addr, at, addr, len, sender, rc)) != 0) + return (err); + dot = at + 1; + while (addr[dot]) { + if ((err = virt(cdb, addr, at, addr + dot, len - dot, sender, rc)) != 0) + return (err); + dot += byte_chr(addr + dot + 1, len - dot - 1, '.') + 1; + } + + if ((err = probe(cdb, '@', addr + at + 1, len - at - 1, 0, 0, &dlen)) < 0) + return (-1); + if (!err) { *rc = 1; return (0); } + if (dlen != 0) { errno = EINVAL; return (-1); } + + return (local(cdb, addr, at, sender, rc)); +} + +#ifdef TEST + +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + int fd; + int rc; + int i; + + if (argc < 4) { + fprintf(stderr, "usage: addrcheck CDB SENDER ADDR...\n"); + return (1); + } + if ((fd = open(argv[1], O_RDONLY)) < 0) { + perror(argv[1]); + return (1); + } + for (i = 3; i < argc; i++) { + if (addrcheck(fd, argv[i], argv[2], &rc) < 0) { + perror("checking"); + return (1); + } + printf("%s: %s\n", argv[i], rc ? "ok" : "bad"); + } + return (0); +} + +#endif diff --git a/addrcheck.h b/addrcheck.h new file mode 100644 index 0000000..b4bc555 --- /dev/null +++ b/addrcheck.h @@ -0,0 +1,6 @@ +#ifndef ADDRCHECK_H +#define ADDRCHECK_H + +extern int addrcheck(int, const char *, const char *, int *); + +#endif diff --git a/binm1+df.sh b/binm1+df.sh index 0ff1a68..f18ceaf 100644 --- a/binm1+df.sh +++ b/binm1+df.sh @@ -5,7 +5,7 @@ # Using binmail to deliver messages to /var/spool/mail/$USER by default. # Using BSD 4.4 binmail interface: /usr/libexec/mail.local -r -exec env - PATH="QMAIL/bin:$PATH" \ +exec env - PATH="/usr/bin:/usr/sbin$PATH" \ qmail-start '|dot-forward .forward |preline -f /usr/libexec/mail.local -r "${SENDER:-MAILER-DAEMON}" -d "$USER"' \ splogger qmail diff --git a/binm1.sh b/binm1.sh index db79cbd..03e5a80 100644 --- a/binm1.sh +++ b/binm1.sh @@ -4,7 +4,7 @@ # Using binmail to deliver messages to /var/spool/mail/$USER by default. # Using BSD 4.4 binmail interface: /usr/libexec/mail.local -r -exec env - PATH="QMAIL/bin:$PATH" \ +exec env - PATH="/usr/bin:/usr/sbin$PATH" \ qmail-start \ '|preline -f /usr/libexec/mail.local -r "${SENDER:-MAILER-DAEMON}" -d "$USER"' \ splogger qmail diff --git a/binm2+df.sh b/binm2+df.sh index 4f78101..0eeae2d 100644 --- a/binm2+df.sh +++ b/binm2+df.sh @@ -5,7 +5,7 @@ # Using binmail to deliver messages to /var/spool/mail/$USER by default. # Using SVR4 binmail interface: /bin/mail -r -exec env - PATH="QMAIL/bin:$PATH" \ +exec env - PATH="/usr/bin:/usr/sbin$PATH" \ qmail-start '|dot-forward .forward |preline -f /bin/mail -r "${SENDER:-MAILER-DAEMON}" -d "$USER"' \ splogger qmail diff --git a/binm2.sh b/binm2.sh index 7905308..5224189 100644 --- a/binm2.sh +++ b/binm2.sh @@ -4,7 +4,7 @@ # Using binmail to deliver messages to /var/spool/mail/$USER by default. # Using SVR4 binmail interface: /bin/mail -r -exec env - PATH="QMAIL/bin:$PATH" \ +exec env - PATH="/usr/bin:/usr/sbin$PATH" \ qmail-start \ '|preline -f /bin/mail -r "${SENDER:-MAILER-DAEMON}" -d "$USER"' \ splogger qmail diff --git a/binm3+df.sh b/binm3+df.sh index 3d69401..686be30 100644 --- a/binm3+df.sh +++ b/binm3+df.sh @@ -5,7 +5,7 @@ # Using binmail to deliver messages to /var/spool/mail/$USER by default. # Using V7 binmail interface: /bin/mail -f -exec env - PATH="QMAIL/bin:$PATH" \ +exec env - PATH="/usr/bin:/usr/sbin$PATH" \ qmail-start '|dot-forward .forward |preline -f /bin/mail -f "${SENDER:-MAILER-DAEMON}" -d "$USER"' \ splogger qmail diff --git a/binm3.sh b/binm3.sh index eb139e6..e2f9254 100644 --- a/binm3.sh +++ b/binm3.sh @@ -4,7 +4,7 @@ # Using binmail to deliver messages to /var/spool/mail/$USER by default. # Using V7 binmail interface: /bin/mail -f -exec env - PATH="QMAIL/bin:$PATH" \ +exec env - PATH="/usr/bin:/usr/sbin$PATH" \ qmail-start \ '|preline -f /bin/mail -f "${SENDER:-MAILER-DAEMON}" -d "$USER"' \ splogger qmail diff --git a/conf-cc b/conf-cc index e58fb9b..0f29a89 100644 --- a/conf-cc +++ b/conf-cc @@ -1,3 +1,3 @@ -cc -O2 +cc -O2 -g This will be used to compile .c files. diff --git a/conf-groups b/conf-groups index cec0845..0c42455 100644 --- a/conf-groups +++ b/conf-groups @@ -1,5 +1,5 @@ qmail -nofiles +nogroup These are the qmail groups. The second group should not have access to any files, but it must be usable for processes; this requirement diff --git a/conf-ld b/conf-ld index a9e796a..0329c85 100644 --- a/conf-ld +++ b/conf-ld @@ -1,3 +1,4 @@ +cc cc -s This will be used to link .o files into an executable. diff --git a/datemail.sh b/datemail.sh index fd28f46..caa2c42 100644 --- a/datemail.sh +++ b/datemail.sh @@ -1 +1 @@ -exec QMAIL/bin/predate QMAIL/bin/sendmail ${1+"$@"} +exec /usr/sbin/predate /usr/sbin/sendmail ${1+"$@"} diff --git a/debian/.gitignore b/debian/.gitignore new file mode 100644 index 0000000..2caa678 --- /dev/null +++ b/debian/.gitignore @@ -0,0 +1,6 @@ +files +qmail-src +tmp +mini-qmail +mini-qmail.substvars +substvars diff --git a/debian/README b/debian/README new file mode 100644 index 0000000..6ff1a99 --- /dev/null +++ b/debian/README @@ -0,0 +1,7 @@ +Things to do when debianizing a new version of qmail. + Christian Hudon + +* Run debian/debianize-source-tree + +NB Programs are classified as belonging to sbin or bin according to their +manual page section. (section 1: bin; section 8: sbin) diff --git a/debian/README.debian b/debian/README.debian new file mode 100644 index 0000000..f5a17bd --- /dev/null +++ b/debian/README.debian @@ -0,0 +1,64 @@ +WARNING - WARNING - WARNING - WARNING - WARNING - WARNING + + qmail does not support dot-locking internally. + + You are in danger of losing mail if you re-configure + qmail without understanding the implications of this. + +WARNING - WARNING - WARNING - WARNING - WARNING - WARNING + +On Debian the standard location for a users mailbox is + + /var/spool/mail/ + +and when programs write to that file they are expected to lock the +file to prevent another process from accessing it at the same time, and +thus corrupting your mail file. + +For reasons explained in /usr/doc/qmail/INSTALL.mbox, qmail does not do this. + +The default setup uses /usr/sbin/qmail-procmail to perform the final +delivery of mail with apropriate dot-locking to prevent loss of mail. +This is just a script that invokes procmail. + +You should not really need to invoke this as a user, but if you can +think of a reason to do so, a line like this in your .qmail file will +result in normal delivery via procmail: + + |/usr/sbin/qmail-procmail + +If you were to instead put something like: + + /var/spool/mail/phil + +in your .qmail file, it would deliver mail to that file, but would +lock it using flock's rather than dot-lock's. Unless you know +different, that would probably mean that every other program on the +system would consider the file to be unlocked, and would leave you +open to mail loss. + +Personally, I'd recommend moving to Maildir/ format if you can. Read +the files in /usr/doc/qmail to find out more. + +--- + +How the Debian setup differs from standard qmail setups: + + The default setup sets aliasempty (i.e. the default delivery method) + to be /usr/sbin/qmail-procmail, which is a wrapper around procmail. + + This results in delivery into /var/spool/mail. + + To change this to one of the more standard qmail setups edit + /etc/init.d/qmail + + The binaries normail found in /var/qmail/bin have been split between + /usr/bin and /usr/sbin. + + The configuration files have been moved to /etc/qmail and the queue + has been moved to /var/spool/qmail. + + Symbolic links have been placed in /var/qmail to make it look like a + normal qmail setup. + +Phil Hands diff --git a/debian/TODO b/debian/TODO new file mode 100644 index 0000000..432d76b --- /dev/null +++ b/debian/TODO @@ -0,0 +1,4 @@ +* Write nice qmailconfig script +* Add aliases for postmaster, root and mailer-daemon +* Enable pop3d daemon? +* Edit /etc/login.defs:MAIL_DIR/MAIL_FILE ? diff --git a/debian/build-qmail b/debian/build-qmail new file mode 100644 index 0000000..dfcf28b --- /dev/null +++ b/debian/build-qmail @@ -0,0 +1,45 @@ +#!/bin/sh -e + +NEWDIR=./qmail + +cat <<-'!END!' + + This script unpacks the qmail source in /usr/src/qmail-src + into a directory, and compiles it to produce a binary qmail*.deb file + The directory where this is done will end up containing the + source and package files for the qmail binary package, along + with a directory containing the unpacked source. + + !END! + +echo -n "Where would you like to do this [$NEWDIR] " +read line + +NEWDIR="${line:-$NEWDIR}" + +if test -d $NEWDIR +then + echo -n "'$NEWDIR' already exists, should I use it anyway ? [yN] " + read yn + test "$yn" = y -o "$yn" = Y || exit 1 +else + mkdir $NEWDIR +fi + +cd $NEWDIR +dpkg-source -x /usr/src/qmail-src/qmail_*.dsc +cd qmail-* + +BECOMEROOT=fakeroot +cat <<-'!END!' + + For some reason fakeroot causes install to hang on my system, so I'm + giving you the option of running sudo or fakeroot. Give fakeroot a try + but if it does not work use sudo instead. + + !END! +echo -n "Should I use sudo or fakeroot to build the package ? [sF] " +read yn +test "$yn" = s -o "$yn" = S && BECOMEROOT=sudo + +dpkg-buildpackage -us -uc -r$BECOMEROOT diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..c85d4b9 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,63 @@ +qmail (1.03-5) unstable; urgency=low + + * make it build again. + * add mini-qmail package. + * support checking of recipient mailboxes in qmail-smtpd. + + -- Mark Wooding Mon, 2 May 2005 14:44:12 +0100 + +qmail (1.03-4) non-free; urgency=low + + * twiddle build system for missed Debians. + * indirect qmail-queue via QMAILQUEUE environment variable + + -- Mark Wooding Wed, 1 Oct 2003 01:16:00 +0100 + +qmail (1.03-3) non-free; urgency=low + + * fix uids for new standards. + + -- Mark Wooding Tue, 14 Oct 2000 08:37:50 +0100 + +qmail (1.03-2) non-free; urgency=low + + * add message-id to bounces. + + -- Mark Wooding Tue, 8 Jun 1999 19:37:43 +0100 + +qmail (1.03-1) non-free; urgency=low + + * new upstream release + + -- Mark Wooding Sun, 28 Jun 1998 12:41:18 +0100 + +qmail (1.01-2) non-free; urgency=low + + * new maintainer + * qmail-1.01.orig.tar.gz now really is pristine source ;-) + * revert to unpatched source, and get dot-locking by use of procmail + * add creation of qmail-src + + -- Philip Hands Fri, 31 Oct 1997 21:13:40 +0000 + +qmail (1.01-1) experimental; urgency=low + + * New upstream release. + * Gave in and added /usr/lib/sendmail symlink (fixes bugs 10283 and 11347) + * Compiled with libc6. + * qmail-1.01.orig.tar.gz is now pristine source, thanks to dpkg 1.4.0.19 + + -- Christian Hudon Fri, 8 Aug 1997 22:22:24 -0400 + +qmail (1.00-2) experimental; urgency=low + + * Fixed error in sed expression of qmailconfig (Thanks to Philip Hands) + * Made '/etc/init.d/qmail stop' output look prettier. + + -- Christian Hudon Sun, 13 Apr 1997 19:12:59 -0400 + +qmail (1.00-1) experimental; urgency=low + + * Initial release. + + -- Christian Hudon Wed, 26 Mar 1997 00:24:38 -0500 diff --git a/debian/conffiles b/debian/conffiles new file mode 100644 index 0000000..49c92fe --- /dev/null +++ b/debian/conffiles @@ -0,0 +1 @@ +/etc/init.d/qmail diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..ac47580 --- /dev/null +++ b/debian/control @@ -0,0 +1,84 @@ +Source: qmail +Maintainer: Mark Wooding +Section: mail +Priority: extra +Standards-Version: 2.1.2.2 + +Package: qmail +Architecture: any +Section: mail +Priority: extra +Depends: ${shlibs:Depends}, netbase, procmail, + python (>= 2.3.5), python-cdb, nsict-cdb +Provides: mail-transport-agent +Conflicts: mail-transport-agent +Suggests: pine | mail-reader +Description: Secure, reliable, efficient, simple mail transport system + qmail is a secure, reliable, efficient, simple message transfer agent. It + is meant as a replacement for the entire sendmail-binmail system on typical + Internet-connected UNIX hosts. + . + Reliable: qmail's straight-paper-path philosophy guarantees that a message, + once accepted into the system, will never be lost. qmail also supports + maildir, a new, super-reliable user mailbox format. Maildirs, unlike mbox + files and mh folders, won't be corrupted if the system crashes during + delivery. Even better, not only can a user safely read his mail over NFS, + but any number of NFS clients can deliver mail to him at the same time. + . + Efficient: On a Pentium, qmail can easily sustain 200000 local messages per + day---that's separate messages injected and delivered to mailboxes in a real + test! Although remote deliveries are inherently limited by the slowness of + DNS and SMTP, qmail overlaps 20 simultaneous deliveries by default, so it + zooms quickly through mailing lists. + . + Simple: qmail is vastly smaller than any other Internet MTA. Some reasons why: + (1) Other MTAs have separate forwarding, aliasing, and mailing list + mechanisms. qmail has one simple forwarding mechanism that lets users handle + their own mailing lists. + (2) Other MTAs offer a spectrum of delivery modes, from fast+unsafe to + slow+queued. qmail-send is instantly triggered by new items in the queue, so + the qmail system has just one delivery mode: fast+queued. + (3) Other MTAs include, in effect, a specialized version of inetd that + watches the load average. qmail's design inherently limits the machine load, + so qmail-smtpd can safely run from your system's inetd. + . + Replacement for sendmail: qmail supports host and user masquerading, full + host hiding, virtual domains, null clients, list-owner rewriting, relay + control, double-bounce recording, arbitrary RFC 822 address lists, cross-host + mailing list loop detection, per-recipient checkpointing, downed host + backoffs, independent message retry schedules, etc. In short, it's up to + speed on modern MTA features. qmail also includes a drop-in ``sendmail'' + wrapper so that it will be used transparently by your current UAs. + +Package: mini-qmail +Architecture: any +Section: mail +Depends: ${shlibs:Depends} +Provides: mail-transport-agent +Conflicts: mail-transport-agent +Description: Secure, reliable, efficient, simple mail transport system + qmail is a secure, reliable, efficient, simple message transfer agent. It + is meant as a replacement for the entire sendmail-binmail system on typical + Internet-connected UNIX hosts. + . + This is the mini-qmail installation which can't deliver locally. It + relies on a QMQP server on another host providing it with a reliable + remote mail queue. As a result, it's really easy to configure and + doesn't require any hassle. + +Package: qmail-src +Architecture: all +Section: mail +Depends: dpkg-dev, fakeroot | sudo +Priority: extra +Description: Source only package for building qmail binary package + qmail is a secure Secure, reliable, efficient, simple mail transport system. + . + Dan Bernstein (qmail's author) only gives permission for qmail to be + distributed in source form, or binary for by approval. This package + has been put together to allow people to easily build a qmail binary + package for themselves, from source. + . + If there is a package called qmail available, then Dan has approved the + binary version of the package for approval, so you might as well install + that and save yourself some effort. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..4ba0bb1 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,33 @@ +Qmail is Copyright 1996, D. J. Bernstein. +-- + +Unfortunately (from SPI's point of view) Dan Bernstein does not include +a conventional licence for qmail, so instead you must examine his published +documentation on the subject to determine your rights to use his software. + +The right to distribute unmodified copies of the qmail-1.01 source is granted +here: + + ftp://koobera.math.uic.edu/www/qmail/dist.html + +In addition, Dan will approve distribution of specific binary packages, which +he should have done for the Debian package that contains this file by the time +you get to read it. + +He also states (see ftp://koobera.math.uic.edu/www/softwarelaw.html) +the following: + + What does all this mean for the free software world? Once you've legally + downloaded a program, you can compile it. You can run it. You can modify + it. You can distribute your patches for other people to use. If you think + you need a license from the copyright holder, you've been bamboozled by + Microsoft. As long as you're not distributing the software, you have + nothing to worry about. + +Of course, this only applies to people under US jurisdiction, but Dan +claims that similar laws are in effect in most of the countries that +take any notice of copyright, so I suppose that one can assume that +this encapsulates his wishes on the subject. + +Cheers, Phil. + diff --git a/debian/debianize-binary-tree b/debian/debianize-binary-tree new file mode 100644 index 0000000..e3c062d --- /dev/null +++ b/debian/debianize-binary-tree @@ -0,0 +1,27 @@ +#!/bin/bash + +set -e + +function startofpath() { + if [ -f usr/share/man/man8/`basename $1`.8 ]; then + echo usr/sbin + elif [ -f usr/share/man/man1/`basename $1`.1 ]; then + echo usr/bin + else + case `basename $1` in + elq|pinq|qail|qlist2) echo usr/bin;; + datemail|predate|qmail-home|qsmhook|sendmail) echo usr/sbin;; + *) echo 1>&2 Cannot determine if $1 belongs in sbin or bin;exit 2;; + esac + fi +} + +test -d debian/tmp || (echo "Could not find debian/tmp directory.";exit 1) + +cd debian/tmp + +for f in var/qmail/bin/*; do + mv $f `startofpath $f` +done + +rmdir var/qmail/bin || ( echo "Could not remove qmail/bin directory!"; exit 3) diff --git a/debian/debianize-source-tree b/debian/debianize-source-tree new file mode 100644 index 0000000..648e8ab --- /dev/null +++ b/debian/debianize-source-tree @@ -0,0 +1,53 @@ +#!/bin/bash + +set -e + +if [ ! -f qmail-start.c ]; then + echo "This program must be run from the qmail source directory!" + exit 1 +fi + +#if [ ! -f qmail-send.8 ]; then +# make man +#fi + +for f in `fgrep -l QMAIL/bin *.sh`; do + mv $f $f.$$ && sed -e "s,QMAIL/bin/predate,/usr/sbin/predate,g" \ + -e "s,QMAIL/bin/sendmail,/usr/sbin/sendmail,g" \ + -e "s,QMAIL/bin/maildir2mbox,/usr/bin/maildir2mbox,g" \ + -e "s,QMAIL/bin/qmail-inject,/usr/sbin/qmail-inject,g" \ + -e "s,QMAIL/bin/qlist,/usr/bin/qlist,g" \ + -e "s,QMAIL/bin:,/usr/bin:/usr/sbin,g" $f.$$ >$f && \ + rm $f.$$ +done + +if ls *.$$ >/dev/null 2>&1; then + echo Error during debianization! Some temporary files remain. + exit 1 +fi + +if fgrep QMAIL/bin *.sh; then + echo Error during debianization! Some .sh files still have relative paths. + exit 2 +fi + + +if fgrep -q nofiles conf-groups; then + if sed conf-groups.$$ -e '2s/nofiles/nogroup/' && \ + mv -f conf-groups.$$ conf-groups; then + echo The file conf-groups was auto-edited. + echo Please eyeball it to see if the editing was done correctly. + echo --- begin conf-groups ---- + cat conf-groups + echo --- end conf-groups ---- + echo + else + echo Error during auto-editing of conf-groups! + exit 3 + fi +fi + +if grep '\"bin/' *.c | grep -v 'qmail-\(check\|setup\)' >/dev/null; then + echo Remember to replace the relative paths by full paths in the following files: + grep '\"bin/' *.c | grep -v 'qmail-\(check\|setup\)' +fi diff --git a/debian/postinst b/debian/postinst new file mode 100644 index 0000000..bb0db8b --- /dev/null +++ b/debian/postinst @@ -0,0 +1,62 @@ +#!/usr/bin/perl + +require DebianNet; + +$| = 1; + +my $action = shift; + +if ( $action eq 'configure' or $action eq 'abort-upgrade' or $action eq 'abort-deconfigure' or $action eq 'abort-remove' ) { + my $old_version = shift; + + DebianNet::add_service('smtp stream tcp nowait qmaild /usr/sbin/tcpd /usr/bin/tcp-env /usr/sbin/qmail-smtpd', + "MAIL"); + DebianNet::enable_service('smtp'); + + # Add rc?.d links + system('update-rc.d qmail defaults >/dev/null'); + + if ( ! -r '/var/qmail/control/me' ) { + system("/usr/sbin/qmailconfig"); + } + + if ( !defined($old_version) || $old_version eq '' ) { + print <<'EOT1'; + +By default qmail will deliver mail to ~/Mailbox instead of /var/spool/mail. +To learn how to deal with this, read the file /usr/doc/qmail/INSTALL.mbox. +Disregard the warning in INSTALL.mbox about qmail-alias using flock to lock +the mailbox. + +If you were using sendmail (or smail) previously, you will want to read +the "qmail-upgrade" manpage, which details user-visible differences between +sendmail and qmail. + +If you are new to qmail, you will want to at least peruse the qmail FAQ, which +can be found in /usr/doc/qmail + +EOT1 + print 'Do you want to start qmail now? [y/N] '; + my $answer = ; + if ( $answer =~ /^\s*[yY]/ ) { + system("/etc/init.d/qmail start"); + } + else { + print <<'EOT2'; +Qmail will be started at the next reboot. Or you can start qmail manually when +you are ready by typing (as root) "/etc/init.d/qmail start" at a shell prompt. +EOT2 + } + } + else { + system("/etc/init.d/qmail start"); + } +} + +-e "/usr/doc/qmail" or + symlink("../share/doc/qmail", "/usr/doc/qmail") or + die "symlink: $!"; + +exit 0; + +__END__ diff --git a/debian/postrm b/debian/postrm new file mode 100644 index 0000000..0e5686f --- /dev/null +++ b/debian/postrm @@ -0,0 +1,18 @@ +#!/usr/bin/perl + +$| = 1; + +$action = shift @ARGV; + +if ( $action eq 'purge' ) { + system('update-rc.d qmail remove >/dev/null'); + system("rm -rf /var/qmail"); + system("rm -rf /etc/qmail"); + exit $?; +} + +if ( $action eq 'abort-install' ) { + # Put back old inetd.conf (?) + exit 0 +} + diff --git a/debian/preinst b/debian/preinst new file mode 100644 index 0000000..e9e2848 --- /dev/null +++ b/debian/preinst @@ -0,0 +1,217 @@ +#!/usr/bin/perl + +require 5.002; +use strict 'subs'; +use English; + +sub check_uid($$$$$$) { + my ($name, $uid, $gid, $gecos, $home, $shell) = @_; + my $ok = 1; + + print "Checking user $name (uid $uid, gid $gid, homedir $home)... "; + @name_entry = getpwnam("$name"); + if ( @name_entry == () ) { + my @uid_entry = getpwuid($uid); + if ( @uid_entry == () ) { + system("adduser --system --quiet --home $home --gid $gid --uid $uid --gecos \'$gecos\' $name >/dev/null 2>&1"); + if ( $? != 0 ) { + print "\n Error while adding user $name!\n"; + $ok = 0; + } + else { + print "added.\n"; + } + system("chsh -s $shell $name"); + } + else { + print "error!\n Uid $uid is being used by user $uid_entry[0]\n"; + $ok = 0; + } + } + else { + if ( $name_entry[3] != $gid ) { + print "error!\n" if $ok; + print " User $name has primary group $name_entry[3] instead of $gid\n"; + $ok = 0; + } + if ( $name_entry[2] != $uid ) { + print "error!\n" if $ok; + print " User $name has uid $name_entry[2] instead of $uid\n"; + $ok = 0; + } + if ( $name_entry[7] ne $home ) { + print "error!\n" if $ok; + print " User $name has home directory $name_entry[7] instead of $home\n"; + $ok = 0; + } + if ( $ok ) { + print "ok.\n"; + } + } + return $ok; +} + +sub check_gid($$@) { + my ($name, $gid, @members) = @_; + my $ok = 1; + + print "Checking group $name (gid $gid)... "; + @name_entry = getgrnam($name); + if ( @name_entry == () ) { + my @gid_entry = getgrgid($gid); + if ( @gid_entry == () ) { + system("addgroup --quiet --gid $gid $name"); + if ( $? != 0 ) { + print "\n Error while adding group $name\n"; + $ok = 0; + } + else { + print "added.\n"; + } + } + else { + print "error!\n Gid $gid is being used by group $gid_entry[0]\n"; + $ok = 0; + } + } + else { + if ( $name_entry[2] != $gid ) { + print "error!\n Group $name has gid $name_entry[2] instead of $gid\n"; + $ok = 0; + } + if ( $ok ) { + print "ok.\n"; + } + } + return $ok; +} + +sub is_qmail_installed { + my $qmail_installed = 0; + + print "Checking if qmail is already installed on this computer... "; + + $qmail_home = ''; + if ( -d '/var/qmail' ) { + print "\n Found /var/qmail directory"; + $qmail_home = '/var/qmail'; + $qmail_installed = 1; + } + else { + $qmail_home = `qmail-home`; + if ( $qmail_home ne '') { + print "\n Found qmail home directory at $qmail_home (using qmail-home program)"; + $qmail_installed = 1; + } + } + + if ( -d '/var/spool/qmail' ) { + print "\n Found qmail spool directory at /var/spool/qmail"; + $qmail_installed = 1; + } + if ( -d '/etc/qmail' ) { + print "\n Found qmail control directory at /etc/qmail"; + $qmail_installed = 1; + } + + if ( (-r '/etc/inetd.conf') and `fgrep -q qmail-smtpd /etc/inetd.conf` ) { + print "\n Found reference to qmail-smtpd in /etc/inetd.conf"; + $qmail_installed = 1; + } + if ( (-r '/etc/xinetd.conf') and `fgrep -q qmail-smtpd /etc/xinetd.conf` ) { + print "\n Found reference to qmail-smtpd in /etc/xinetd.conf"; + $qmail_installed = 1; + } + + if ( -x '/etc/init.d/qmail' ) { + print "\n Found /etc/init.d/qmail script"; + $qmail_installed = 1; + } + elsif ( `fgrep -q qmail-start /etc/init.d/*` ) { + print "\n Found reference to qmail-start in /etc/init.d directory"; + $qmail_installed = 1; + } + if ( -x '/etc/rc.local' and `fgrep -q qmail-start /etc/rc.local` ) { + print "\n Found reference to qmail-start in /etc/rc.local"; + $qmail_installed = 1; + } + + if ( `killall -0 qmail-send >/dev/null 2>&1` ) { + print "\n Found qmail-send process running"; + $qmail_installed = 1; + } + + print 'no.' unless $qmail_installed; + print "\n"; + return $qmail_installed; +} + + +$| = 1; + +$action = shift; + +if ( $action eq 'install' ) { + $old_version = shift; + if ( ! defined $old_version || $old_version eq '' ) { + print "First installation of the Debian qmail package...\n"; + # Check if a non-Debian qmail is installed... + if ( is_qmail_installed() ) { + print "Please remove your copy of qmail before installing the qmail Debian package.\n\n"; + exit 1; + } + # Check for qmail uids and gids + my $errors; + $errors++ unless check_gid('qmail', 64010, ()); + #$errors++ unless check_gid('nogroup', 65534, ()); + + $errors++ unless check_uid('alias', 64010, 65534, 'qmail alias', '/var/qmail/alias', '/bin/sh'); + $errors++ unless check_uid('qmaild', 64011, 65534, 'qmail daemon', '/var/qmail', '/bin/sh'); + $errors++ unless check_uid('qmails', 64012, 64010, 'qmail send', '/var/qmail', '/bin/sh'); + $errors++ unless check_uid('qmailr', 64013, 64010, 'qmail remote', '/var/qmail', '/bin/sh'); + $errors++ unless check_uid('qmailq', 64015, 64010, 'qmail queue', '/var/qmail', '/bin/sh'); + $errors++ unless check_uid('qmaill', 64016, 65534, 'qmail log', '/var/qmail', '/bin/sh'); + $errors++ unless check_uid('qmailp', 64017, 65534, 'qmail pw', '/var/qmail', '/bin/sh'); + #$errors++ unless check_uid('nobody', 65534, 65534, 'nobody', '/tmp', '/bin/sh'); + + if ( $errors ) { + print "\n$errors entries have errors. Please correct these errors and reinstall qmail.\n"; + exit 2; + } + } + + # Make sure there are no smtp entries in /etc/inetd.conf + # Kludge around smail buggy /etc/inetd.conf handling. (Grr.) + my $fixed_smail = 0; + my $found_commented = 0; + my $found_uncommented = 0; + my $new_inetd = "/etc/inetd.conf.qmail-preinst.$$"; + open I, '$new_inetd" or die "Could not create $new_inetd\n"; + while () { + if ( m|^\# *smtp\s+.*/usr/sbin/in.smtpd.*\(will be restored by smail postinst\)\s*$| ) { + $fixed_smail = 1; + next; + } elsif ( m/^\# *smtp\s+/ ) { + $found_commented= 1; + } elsif ( m/^smtp\s+/ ) { + $found_uncommented= 1; + } + print N or die "Cannot write to $new_inetd\n"; + } + close N or die "Could not close $new_inetd\n"; + close I or die "Could not close /etc/inetd.conf\n"; + if ( $found_commented or $found_uncommented ) { + print "Your /etc/inetd.conf already containts entries for the SMTP service.\n"; + print "Please remove all SMTP entries from /etc/inetd.conf (even those commented out)\n"; + print "and reinstall the qmail package.\n\n"; + exit 1; + } + if ( $fixed_smail ) { + print "Removing commented smtp entry left by buggy version of smail postinst... "; + rename "$new_inetd", '/etc/inetd.conf' or die "failed!\n"; + print "done.\n"; + } +} + +exit 0; diff --git a/debian/prerm b/debian/prerm new file mode 100644 index 0000000..44d0663 --- /dev/null +++ b/debian/prerm @@ -0,0 +1,53 @@ +#!/usr/bin/perl + +require DebianNet; + +$| = 1; + +$action = shift; + +if ( $action eq 'failed-upgrade' ) { + exit 1; +} + +if ( $action eq 'upgrade' or $action eq 'deconfigure' ) { + system("/etc/init.d/qmail stop"); + exit $? if $?; + DebianNet::disable_service('smtp'); + exit 0; +} + +if ( $action eq 'remove' ) { + # Ask for confirmation if there are still messages in qmail's queue. + $mesg_inqueue = `find /var/qmail/queue/mess -type f -print | wc -l`; + $mesg_inqueue =~ s/\s//g; + $mesg_unprocessed = `find /var/qmail/queue/todo -type f -print | wc -l`; + $mesg_unprocessed =~ s/\s//g; + + if ( $mesg_inqueue != 0 || $mesg_unprocessed != 0 ) { + print STDERR <; + exit 1 unless $answer =~ /^\s*[yY]/; + } + + # Remove qmail-smtpd from inetd.conf + DebianNet::remove_service('smtp\s+stream\s+tcp\s+nowait\s+qmaild.*/usr/sbin/qmail-smtpd'); + + # Stop qmail process. + system("/etc/init.d/qmail stop"); + exit $? if $?; +} + +unlink("/usr/doc/qmail"); + +exit 0; + +__END__; diff --git a/debian/qmail b/debian/qmail new file mode 100644 index 0000000..55e7faa --- /dev/null +++ b/debian/qmail @@ -0,0 +1,90 @@ +#!/bin/sh +# +# /etc/init.d/qmail : start or stop the qmail mail subsystem. +# +# Written by Christian Hudon + +# +# Configuration +# + + +# set default delivery method + +alias_empty="|/usr/sbin/qmail-procmail" # procmail delivery to /var/spool/mail +#alias_empty="./Maildir/" # This uses qmail prefered ~/Maildir/ directory +#alias_empty="./Mailbox" # This uses Mailbox file in users $HOME + +logger="splogger qmail" +#logger="|accustamp >>/var/log/qmail.log" # If you have accustamp installed. +#logger=">>/var/log/qmail.log" # Does not give timing info. + +# If you uncommented one of the lines that appends to /var/log/qmail.log, you +# need to uncomment the following two lines. +#touch /var/log/qmail.log +#chown qmaill /var/log/qmail.log + +# +# End of configuration +# + +test -x /usr/sbin/qmail-start || exit 0 +test -x /usr/sbin/qmail-send || exit 0 + +case "$1" in + start) + echo -n "Starting mail-transfer agent: qmail" + sh -c "start-stop-daemon --start --quiet \ + --exec /usr/sbin/qmail-send \ + --startas /usr/sbin/qmail-start -- \"$alias_empty\" $logger &" + echo "." + ;; + stop) + echo -n "Stopping mail-transfer agent: qmail" + if [ "`pidof /usr/sbin/qmail-send`" ] ; then + start-stop-daemon --stop --quiet --oknodo --exec /usr/sbin/qmail-send + + # Wait until the timeout for qmail processes to die. + count=120 + numdots=0 + while ([ $count != 0 ]) do + let count=$count-1 + if [ "`pidof /usr/sbin/qmail-send`" ] ; then + echo -n . + let numdots=$numdots+1 + sleep 1 + else + count=0 + fi + done + + # If it's not dead yet, kill it. +# if [ "`pidof /usr/sbin/qmail-send`" ] ; then +# echo -n " TIMEOUT!" +# kill -KILL `pidof /usr/sbin/qmail-send` +# else + case $numdots in + 0) echo "." ;; + 1) echo ;; + *) echo " done." ;; + esac +# fi + else + echo " not running."; + fi + + ;; + restart) + $0 stop + $0 start + ;; + reload) + echo "Reloading 'locals' and 'virtualdomains' control files." + start-stop-daemon --stop --quiet --oknodo --signal HUP --exec /usr/sbin/qmail-send + ;; + *) + echo 'Usage: /etc/init.d/qmail {start|stop|restart|reload}' + exit 1 +esac + +exit 0 diff --git a/debian/qmail-src.README b/debian/qmail-src.README new file mode 100644 index 0000000..f6250c3 --- /dev/null +++ b/debian/qmail-src.README @@ -0,0 +1,9 @@ +This is a feeble little package that just contains a script to unpack +and build qmail from source, so that we don't violate Dan Bernstein's +`no binary distribution, without approval' restriction. + +Hopefully this will help allow a binary package to be approved, but +even if it doesn't it means that Debian users can use qmail without to +much effort. + +Philip Hands diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..b9ceed6 --- /dev/null +++ b/debian/rules @@ -0,0 +1,133 @@ +#!/usr/bin/make -f +# + +mdw-setup: + upstream=`git-describe djb | sed 's:^djb/::'`; \ + dir=qmail_$$upstream.orig; \ + git-tar-tree djb $$dir | gzip -9c >../$$dir.tar.gz + +build: + $(checkdir) + if fgrep QMAIL/bin *.sh >/dev/null; then \ + echo >&2 "You must run debian/debianize-source-tree first!"; \ + exit 1; \ + fi + $(MAKE) man + $(MAKE) + touch build + +clean: + $(checkdir) + -rm -f build + -$(MAKE) clean + -rm `find . -name "*~"` + -rm -rf debian/files + -rm -rf `find debian/* ! \( -name CVS -prune \) -type d -prune` + +binary-indep: checkroot build + $(checkdir) + +binary-arch: checkroot build + $(checkdir) + -rm -rf debian/files debian/substvars debian/tmp + -rm -rf `find ! \( -name CVS -prune \) debian/* -type d -prune` +# Make the directory tree and copy qmail files. + install -d debian/tmp/etc/init.d \ + debian/tmp/usr/share/doc/qmail \ + debian/tmp/var/qmail \ + debian/tmp/var/spool \ + debian/tmp/usr/bin \ + debian/tmp/usr/sbin \ + debian/tmp/usr/lib \ + debian/qmail-src/usr/bin \ + debian/qmail-src/usr/src/qmail-src \ + debian/qmail-src/usr/share/doc/qmail-src + ./install `pwd`/debian/tmp/var/qmail + mv debian/tmp/var/qmail/queue debian/tmp/var/spool/qmail + mv debian/tmp/var/qmail/control debian/tmp/etc/qmail + (cd debian/tmp/var/qmail && ln -s /var/spool/qmail queue) + (cd debian/tmp/var/qmail && ln -s /etc/qmail control) + mv debian/tmp/var/qmail/man debian/tmp/usr/share/man && \ + rm -r debian/tmp/usr/share/man/cat? +# Move /var/qmail/bin programs to either /usr/bin or /usr/sbin + bash debian/debianize-binary-tree +# Create /usr/lib/sendmail symlink for backward compatibility. + (cd debian/tmp/usr/lib && ln -s ../sbin/sendmail) +# Copy qmailconfig and its helper programs... + install -o root -g root -m 755 dnsfq debian/tmp/usr/sbin/qmailconfig-dnsfq + install -o root -g root -m 755 dnsip debian/tmp/usr/sbin/qmailconfig-dnsip + install -o root -g root -m 755 ipmeprint debian/tmp/usr/sbin/qmailconfig-ipmeprint + install -o root -g root -m 755 dnsptr debian/tmp/usr/sbin/qmailconfig-dnsptr +# (This one is a bit of a kludge...) + sed -e 's|./hostname|hostname|g' \ + -e 's|\./dnsptr|/usr/sbin/qmailconfig-dnsptr|g' \ + -e 's|\./dnsip|/usr/sbin/qmailconfig-dnsip|g' \ + -e 's|\./dnsfq|/usr/sbin/qmailconfig-dnsfq|g' \ + -e 's|\./ipmeprint|/usr/sbin/qmailconfig-ipmeprint|g' \ + config >debian/tmp/usr/sbin/qmailconfig + chmod 755 debian/tmp/usr/sbin/qmailconfig +# Install /etc/init.d/qmail + install -o root -g root -m 755 debian/qmail debian/tmp/etc/init.d/qmail +# Copy /usr/share/doc/qmail files. + install -o root -g root -m 644 debian/changelog debian/tmp/usr/share/doc/qmail/changelog.Debian + rm -rf debian/tmp/var/qmail/doc +# do the stuff for qmail-src + fullver=`dpkg-parsechangelog | sed -n 's/^Version: \(.*\)$$/\1/p'` && \ + ver=`echo $$fullver | sed 's/-.*//'` && \ + cp ../qmail_$$ver.orig.tar.gz ../qmail_$$fullver.diff.gz \ + ../qmail_$$fullver.dsc debian/qmail-src/usr/src/qmail-src + install -m 755 debian/build-qmail debian/qmail-src/usr/bin + install debian/copyright debian/qmail-src/usr/share/doc/qmail-src + install debian/qmail-src.README debian/qmail-src/usr/share/doc/qmail-src/README +# Correct permissions of binaries and manpages... + chmod go+rx debian/tmp/usr/*bin/* + chown -R root.root debian/tmp/usr/share/man +# Do stuff for qmail-leaf + rm -rf debian/mini-qmail + cp -a debian/tmp debian/mini-qmail + rm -rf debian/mini-qmail/etc/init.d + for i in \ + bouncesaying except qreceipt qbiff tcp-env \ + condredirect preline log dot-qmail qmail-valid-addresses; do \ + rm -f debian/mini-qmail/usr/share/man?/$$i.*; \ + rm -f debian/mini-qmail/usr/*bin/$$i/*; \ + done + for i in \ + getpw remote rspawn clean send start splogger queue newu \ + pw2u qread qstat tcpok pop3d popup qmqpd qmtpd smtpd command \ + local lspawn newmrh users; do \ + rm -f debian/mini-qmail/usr/share/man?/qmail-$$i.*; \ + rm -f debian/mini-qmail/usr/*bin/qmail-$$i; \ + done + rm -rf debian/mini-qmail/var/spool + for i in alias boot queue users; do \ + rm -rf debian/mini-qmail/var/qmail/$$i; \ + done + ln -s qmail-qmqpc debian/mini-qmail/usr/sbin/qmail-queue +# Fix everything up + debstd -m CHANGES BLURB* FAQ INTERNALS README \ + SECURITY INSTALL.* PIC.* REMOVE.* SYSDEPS THANKS THOUGHTS \ + TODO SENDMAIL TEST.* UPGRADE + cp -r debian/tmp/usr/share/doc/qmail \ + debian/mini-qmail/usr/share/doc/mini-qmail + dpkg-gencontrol -pqmail +# And finally, build the Debian package! + dpkg --build debian/tmp .. + dpkg --build debian/mini-qmail .. + +define checkdir + test -f qmail-send.c -a -f debian/rules +endef + +binary: binary-indep binary-arch + +source: clean mdw-setup + dir=`pwd | sed 's:^.*/::'`; \ + cd ..; \ + dpkg-source -b -i'(?:^|/)\.git(?:$$|/)' $$dir + +checkroot: + $(checkdir) + test "`whoami`" = root + +.PHONY: binary binary-arch binary-indep clean checkroot source mdw-setup diff --git a/debian/suid b/debian/suid new file mode 100644 index 0000000..cfb931e --- /dev/null +++ b/debian/suid @@ -0,0 +1 @@ +off diff --git a/elq.sh b/elq.sh index 7e20262..22a327d 100644 --- a/elq.sh +++ b/elq.sh @@ -1 +1 @@ -QMAIL/bin/maildir2mbox && exec elm ${1+"$@"} +/usr/bin/maildir2mbox && exec elm ${1+"$@"} diff --git a/error.h b/error.h index 01bd3dc..5d98c6b 100644 --- a/error.h +++ b/error.h @@ -1,7 +1,7 @@ #ifndef ERROR_H #define ERROR_H -extern int errno; +#include extern int error_intr; extern int error_nomem; diff --git a/hier.c b/hier.c index 28e568d..0c692f7 100644 --- a/hier.c +++ b/hier.c @@ -6,7 +6,8 @@ char buf[100 + FMT_ULONG]; -void dsplit(base,uid,mode) +void dsplit(home,base,uid,mode) +char *home; char *base; /* must be under 100 bytes */ int uid; int mode; @@ -14,7 +15,7 @@ int mode; char *x; unsigned long i; - d(auto_qmail,base,uid,auto_gidq,mode); + d(home,base,uid,auto_gidq,mode); for (i = 0;i < auto_split;++i) { x = buf; @@ -23,230 +24,237 @@ int mode; x += fmt_ulong(x,i); *x = 0; - d(auto_qmail,buf,uid,auto_gidq,mode); + d(home,buf,uid,auto_gidq,mode); } } -void hier() +void hier(home) +char *home; { - h(auto_qmail,auto_uido,auto_gidq,0755); - - 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,"boot",auto_uido,auto_gidq,0755); - d(auto_qmail,"doc",auto_uido,auto_gidq,0755); - d(auto_qmail,"man",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/cat1",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/cat5",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/cat7",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/cat8",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/man1",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/man5",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/man7",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/man8",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/intd",auto_uidq,auto_gidq,0700); - d(auto_qmail,"queue/todo",auto_uidq,auto_gidq,0750); - d(auto_qmail,"queue/bounce",auto_uids,auto_gidq,0700); - - dsplit("queue/mess",auto_uidq,0750); - dsplit("queue/info",auto_uids,0700); - 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",1024,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); - - c(auto_qmail,"boot","home",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","home+df",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","proc",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","proc+df",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm1",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm1+df",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm2",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm2+df",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm3",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm3+df",auto_uido,auto_gidq,0755); - - c(auto_qmail,"doc","FAQ",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","UPGRADE",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","SENDMAIL",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.alias",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.ctl",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.ids",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.maildir",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.mbox",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.vsm",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","TEST.deliver",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","TEST.receive",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","REMOVE.sendmail",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","REMOVE.binmail",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.local2alias",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.local2ext",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.local2local",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.local2rem",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.local2virt",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.nullclient",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.relaybad",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.relaygood",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.rem2local",auto_uido,auto_gidq,0644); - - c(auto_qmail,"bin","qmail-queue",auto_uidq,auto_gidq,04711); - c(auto_qmail,"bin","qmail-lspawn",auto_uido,auto_gidq,0700); - c(auto_qmail,"bin","qmail-start",auto_uido,auto_gidq,0700); - c(auto_qmail,"bin","qmail-getpw",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-local",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-remote",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-rspawn",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-clean",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-send",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","splogger",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-newu",auto_uido,auto_gidq,0700); - c(auto_qmail,"bin","qmail-newmrh",auto_uido,auto_gidq,0700); - c(auto_qmail,"bin","qmail-pw2u",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-inject",auto_uido,auto_gidq,0755); - 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); - c(auto_qmail,"bin","qmail-showctl",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-qread",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-qstat",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-tcpto",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-tcpok",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-pop3d",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-popup",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-qmqpc",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-qmqpd",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-qmtpd",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-smtpd",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","sendmail",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","tcp-env",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qreceipt",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qsmhook",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qbiff",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","forward",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","preline",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","condredirect",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","bouncesaying",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","except",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","maildirmake",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","maildir2mbox",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","maildirwatch",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qail",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","elq",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","pinq",auto_uido,auto_gidq,0755); - - c(auto_qmail,"man/man5","addresses.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","addresses.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","envelopes.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","envelopes.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","maildir.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","maildir.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","mbox.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","mbox.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","dot-qmail.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","dot-qmail.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","qmail-control.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","qmail-control.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","qmail-header.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","qmail-header.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","qmail-log.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","qmail-log.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","qmail-users.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","qmail-users.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","tcp-environ.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","tcp-environ.0",auto_uido,auto_gidq,0644); - - c(auto_qmail,"man/man7","forgeries.7",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat7","forgeries.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man7","qmail-limits.7",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat7","qmail-limits.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man7","qmail.7",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat7","qmail.0",auto_uido,auto_gidq,0644); - - c(auto_qmail,"man/man1","forward.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","forward.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","condredirect.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","condredirect.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","bouncesaying.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","bouncesaying.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","except.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","except.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","maildirmake.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","maildirmake.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","maildir2mbox.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","maildir2mbox.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","maildirwatch.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","maildirwatch.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","mailsubj.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","mailsubj.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","qreceipt.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","qreceipt.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","qbiff.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","qbiff.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","preline.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","preline.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","tcp-env.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","tcp-env.0",auto_uido,auto_gidq,0644); - - c(auto_qmail,"man/man8","qmail-local.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-local.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-lspawn.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-lspawn.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-getpw.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-getpw.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-remote.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-remote.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-rspawn.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-rspawn.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-clean.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-clean.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-send.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-send.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-start.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-start.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","splogger.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","splogger.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-queue.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-queue.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-inject.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-inject.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-showctl.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-showctl.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-newmrh.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-newmrh.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-newu.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-newu.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-pw2u.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-pw2u.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-qread.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-qread.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-qstat.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-qstat.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-tcpok.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-tcpok.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-tcpto.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-tcpto.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-pop3d.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-pop3d.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-popup.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-popup.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-qmqpc.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-qmqpc.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-qmqpd.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-qmqpd.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-qmtpd.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-qmtpd.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-smtpd.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-smtpd.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-command.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-command.0",auto_uido,auto_gidq,0644); + if (!home) + home = auto_qmail; + + h(home,auto_uido,auto_gidq,0755); + + d(home,"control",auto_uido,auto_gidq,0755); + d(home,"users",auto_uido,auto_gidq,0755); + d(home,"bin",auto_uido,auto_gidq,0755); + d(home,"boot",auto_uido,auto_gidq,0755); + d(home,"doc",auto_uido,auto_gidq,0755); + d(home,"man",auto_uido,auto_gidq,0755); + d(home,"man/cat1",auto_uido,auto_gidq,0755); + d(home,"man/cat5",auto_uido,auto_gidq,0755); + d(home,"man/cat7",auto_uido,auto_gidq,0755); + d(home,"man/cat8",auto_uido,auto_gidq,0755); + d(home,"man/man1",auto_uido,auto_gidq,0755); + d(home,"man/man5",auto_uido,auto_gidq,0755); + d(home,"man/man7",auto_uido,auto_gidq,0755); + d(home,"man/man8",auto_uido,auto_gidq,0755); + + d(home,"alias",auto_uida,auto_gidq,02755); + + d(home,"queue",auto_uidq,auto_gidq,0750); + d(home,"queue/pid",auto_uidq,auto_gidq,0700); + d(home,"queue/intd",auto_uidq,auto_gidq,0700); + d(home,"queue/todo",auto_uidq,auto_gidq,0750); + d(home,"queue/bounce",auto_uids,auto_gidq,0700); + + dsplit(home,"queue/mess",auto_uidq,0750); + dsplit(home,"queue/info",auto_uids,0700); + dsplit(home,"queue/local",auto_uids,0700); + dsplit(home,"queue/remote",auto_uids,0700); + + d(home,"queue/lock",auto_uidq,auto_gidq,0750); + z(home,"queue/lock/tcpto",1024,auto_uidr,auto_gidq,0644); + z(home,"queue/lock/sendmutex",0,auto_uids,auto_gidq,0600); + p(home,"queue/lock/trigger",auto_uids,auto_gidq,0622); + + c(home,"boot","home",auto_uido,auto_gidq,0755); + c(home,"boot","home+df",auto_uido,auto_gidq,0755); + c(home,"boot","proc",auto_uido,auto_gidq,0755); + c(home,"boot","proc+df",auto_uido,auto_gidq,0755); + c(home,"boot","binm1",auto_uido,auto_gidq,0755); + c(home,"boot","binm1+df",auto_uido,auto_gidq,0755); + c(home,"boot","binm2",auto_uido,auto_gidq,0755); + c(home,"boot","binm2+df",auto_uido,auto_gidq,0755); + c(home,"boot","binm3",auto_uido,auto_gidq,0755); + c(home,"boot","binm3+df",auto_uido,auto_gidq,0755); + + c(home,"doc","FAQ",auto_uido,auto_gidq,0644); + c(home,"doc","UPGRADE",auto_uido,auto_gidq,0644); + c(home,"doc","SENDMAIL",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.alias",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.ctl",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.ids",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.maildir",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.mbox",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.vsm",auto_uido,auto_gidq,0644); + c(home,"doc","TEST.deliver",auto_uido,auto_gidq,0644); + c(home,"doc","TEST.receive",auto_uido,auto_gidq,0644); + c(home,"doc","REMOVE.sendmail",auto_uido,auto_gidq,0644); + c(home,"doc","REMOVE.binmail",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.local2alias",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.local2ext",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.local2local",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.local2rem",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.local2virt",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.nullclient",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.relaybad",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.relaygood",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.rem2local",auto_uido,auto_gidq,0644); + + c(home,"bin","qmail-queue",auto_uidq,auto_gidq,04711); + c(home,"bin","qmail-lspawn",auto_uido,auto_gidq,0700); + c(home,"bin","qmail-start",auto_uido,auto_gidq,0700); + c(home,"bin","qmail-getpw",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-local",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-remote",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-rspawn",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-clean",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-send",auto_uido,auto_gidq,0711); + c(home,"bin","splogger",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-newu",auto_uido,auto_gidq,0700); + c(home,"bin","qmail-newmrh",auto_uido,auto_gidq,0700); + c(home,"bin","qmail-pw2u",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-inject",auto_uido,auto_gidq,0755); + c(home,"bin","predate",auto_uido,auto_gidq,0755); + c(home,"bin","datemail",auto_uido,auto_gidq,0755); + c(home,"bin","mailsubj",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-showctl",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-qread",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-qstat",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-tcpto",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-tcpok",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-pop3d",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-popup",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-qmqpc",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-qmqpd",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-qmtpd",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-smtpd",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-valid-addresses",auto_uido,auto_gidq,0755); + c(home,"bin","sendmail",auto_uido,auto_gidq,0755); + c(home,"bin","tcp-env",auto_uido,auto_gidq,0755); + c(home,"bin","qreceipt",auto_uido,auto_gidq,0755); + c(home,"bin","qsmhook",auto_uido,auto_gidq,0755); + c(home,"bin","qbiff",auto_uido,auto_gidq,0755); + c(home,"bin","forward",auto_uido,auto_gidq,0755); + c(home,"bin","preline",auto_uido,auto_gidq,0755); + c(home,"bin","condredirect",auto_uido,auto_gidq,0755); + c(home,"bin","bouncesaying",auto_uido,auto_gidq,0755); + c(home,"bin","except",auto_uido,auto_gidq,0755); + c(home,"bin","maildirmake",auto_uido,auto_gidq,0755); + c(home,"bin","maildir2mbox",auto_uido,auto_gidq,0755); + c(home,"bin","maildirwatch",auto_uido,auto_gidq,0755); + c(home,"bin","qail",auto_uido,auto_gidq,0755); + c(home,"bin","elq",auto_uido,auto_gidq,0755); + c(home,"bin","pinq",auto_uido,auto_gidq,0755); + + c(home,"man/man5","addresses.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","addresses.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","envelopes.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","envelopes.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","maildir.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","maildir.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","mbox.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","mbox.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","dot-qmail.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","dot-qmail.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","qmail-control.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","qmail-control.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","qmail-header.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","qmail-header.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","qmail-log.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","qmail-log.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","qmail-users.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","qmail-users.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","tcp-environ.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","tcp-environ.0",auto_uido,auto_gidq,0644); + + c(home,"man/man7","forgeries.7",auto_uido,auto_gidq,0644); + c(home,"man/cat7","forgeries.0",auto_uido,auto_gidq,0644); + c(home,"man/man7","qmail-limits.7",auto_uido,auto_gidq,0644); + c(home,"man/cat7","qmail-limits.0",auto_uido,auto_gidq,0644); + c(home,"man/man7","qmail.7",auto_uido,auto_gidq,0644); + c(home,"man/cat7","qmail.0",auto_uido,auto_gidq,0644); + + c(home,"man/man1","forward.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","forward.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","condredirect.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","condredirect.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","bouncesaying.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","bouncesaying.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","except.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","except.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","maildirmake.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","maildirmake.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","maildir2mbox.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","maildir2mbox.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","maildirwatch.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","maildirwatch.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","mailsubj.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","mailsubj.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","qreceipt.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","qreceipt.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","qbiff.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","qbiff.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","preline.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","preline.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","tcp-env.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","tcp-env.0",auto_uido,auto_gidq,0644); + + c(home,"man/man8","qmail-local.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-local.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-lspawn.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-lspawn.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-getpw.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-getpw.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-remote.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-remote.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-rspawn.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-rspawn.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-clean.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-clean.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-send.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-send.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-start.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-start.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","splogger.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","splogger.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-queue.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-queue.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-inject.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-inject.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-showctl.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-showctl.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-newmrh.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-newmrh.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-newu.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-newu.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-pw2u.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-pw2u.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-qread.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-qread.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-qstat.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-qstat.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-tcpok.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-tcpok.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-tcpto.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-tcpto.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-pop3d.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-pop3d.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-popup.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-popup.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-qmqpc.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-qmqpc.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-qmqpd.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-qmqpd.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-qmtpd.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-qmtpd.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-smtpd.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-smtpd.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-command.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-command.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-valid-addresses.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-valid-addresses.0",auto_uido,auto_gidq,0644); } diff --git a/home+df.sh b/home+df.sh index 7885cdf..591dc2e 100644 --- a/home+df.sh +++ b/home+df.sh @@ -4,6 +4,6 @@ # Using dot-forward to support sendmail-style ~/.forward files. # Using qmail-local to deliver messages to ~/Mailbox by default. -exec env - PATH="QMAIL/bin:$PATH" \ +exec env - PATH="/usr/bin:/usr/sbin$PATH" \ qmail-start '|dot-forward .forward ./Mailbox' splogger qmail diff --git a/home.sh b/home.sh index c96c02b..569e469 100644 --- a/home.sh +++ b/home.sh @@ -3,5 +3,5 @@ # Using splogger to send the log through syslog. # Using qmail-local to deliver messages to ~/Mailbox by default. -exec env - PATH="QMAIL/bin:$PATH" \ +exec env - PATH="/usr/bin:/usr/sbin$PATH" \ qmail-start ./Mailbox splogger qmail diff --git a/install-big.c b/install-big.c index df813df..a390e03 100644 --- a/install-big.c +++ b/install-big.c @@ -6,7 +6,8 @@ char buf[100 + FMT_ULONG]; -void dsplit(base,uid,mode) +void dsplit(home,base,uid,mode) +char *home; char *base; /* must be under 100 bytes */ int uid; int mode; @@ -14,7 +15,7 @@ int mode; char *x; unsigned long i; - d(auto_qmail,base,uid,auto_gidq,mode); + d(home,base,uid,auto_gidq,mode); for (i = 0;i < auto_split;++i) { x = buf; @@ -23,263 +24,268 @@ int mode; x += fmt_ulong(x,i); *x = 0; - d(auto_qmail,buf,uid,auto_gidq,mode); + d(home,buf,uid,auto_gidq,mode); } } -void hier() +void hier(home) +char *home; { - h(auto_qmail,auto_uido,auto_gidq,0755); + if (!home) + home = auto_qmail; - 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,"boot",auto_uido,auto_gidq,0755); - d(auto_qmail,"doc",auto_uido,auto_gidq,0755); - d(auto_qmail,"man",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/cat1",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/cat5",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/cat7",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/cat8",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/man1",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/man5",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/man7",auto_uido,auto_gidq,0755); - d(auto_qmail,"man/man8",auto_uido,auto_gidq,0755); + h(home,auto_uido,auto_gidq,0755); - d(auto_qmail,"alias",auto_uida,auto_gidq,02755); + d(home,"control",auto_uido,auto_gidq,0755); + d(home,"users",auto_uido,auto_gidq,0755); + d(home,"bin",auto_uido,auto_gidq,0755); + d(home,"boot",auto_uido,auto_gidq,0755); + d(home,"doc",auto_uido,auto_gidq,0755); + d(home,"man",auto_uido,auto_gidq,0755); + d(home,"man/cat1",auto_uido,auto_gidq,0755); + d(home,"man/cat5",auto_uido,auto_gidq,0755); + d(home,"man/cat7",auto_uido,auto_gidq,0755); + d(home,"man/cat8",auto_uido,auto_gidq,0755); + d(home,"man/man1",auto_uido,auto_gidq,0755); + d(home,"man/man5",auto_uido,auto_gidq,0755); + d(home,"man/man7",auto_uido,auto_gidq,0755); + d(home,"man/man8",auto_uido,auto_gidq,0755); - d(auto_qmail,"queue",auto_uidq,auto_gidq,0750); - d(auto_qmail,"queue/pid",auto_uidq,auto_gidq,0700); - d(auto_qmail,"queue/intd",auto_uidq,auto_gidq,0700); - d(auto_qmail,"queue/todo",auto_uidq,auto_gidq,0750); - d(auto_qmail,"queue/bounce",auto_uids,auto_gidq,0700); + d(home,"alias",auto_uida,auto_gidq,02755); - dsplit("queue/mess",auto_uidq,0750); - dsplit("queue/info",auto_uids,0700); - dsplit("queue/local",auto_uids,0700); - dsplit("queue/remote",auto_uids,0700); + d(home,"queue",auto_uidq,auto_gidq,0750); + d(home,"queue/pid",auto_uidq,auto_gidq,0700); + d(home,"queue/intd",auto_uidq,auto_gidq,0700); + d(home,"queue/todo",auto_uidq,auto_gidq,0750); + d(home,"queue/bounce",auto_uids,auto_gidq,0700); - d(auto_qmail,"queue/lock",auto_uidq,auto_gidq,0750); - z(auto_qmail,"queue/lock/tcpto",1024,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); + dsplit(home,"queue/mess",auto_uidq,0750); + dsplit(home,"queue/info",auto_uids,0700); + dsplit(home,"queue/local",auto_uids,0700); + dsplit(home,"queue/remote",auto_uids,0700); - c(auto_qmail,"boot","home",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","home+df",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","proc",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","proc+df",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm1",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm1+df",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm2",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm2+df",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm3",auto_uido,auto_gidq,0755); - c(auto_qmail,"boot","binm3+df",auto_uido,auto_gidq,0755); + d(home,"queue/lock",auto_uidq,auto_gidq,0750); + z(home,"queue/lock/tcpto",1024,auto_uidr,auto_gidq,0644); + z(home,"queue/lock/sendmutex",0,auto_uids,auto_gidq,0600); + p(home,"queue/lock/trigger",auto_uids,auto_gidq,0622); - c(auto_qmail,"doc","FAQ",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","UPGRADE",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","SENDMAIL",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.alias",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.ctl",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.ids",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.maildir",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.mbox",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","INSTALL.vsm",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","TEST.deliver",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","TEST.receive",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","REMOVE.sendmail",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","REMOVE.binmail",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.local2alias",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.local2ext",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.local2local",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.local2rem",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.local2virt",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.nullclient",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.relaybad",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.relaygood",auto_uido,auto_gidq,0644); - c(auto_qmail,"doc","PIC.rem2local",auto_uido,auto_gidq,0644); + c(home,"boot","home",auto_uido,auto_gidq,0755); + c(home,"boot","home+df",auto_uido,auto_gidq,0755); + c(home,"boot","proc",auto_uido,auto_gidq,0755); + c(home,"boot","proc+df",auto_uido,auto_gidq,0755); + c(home,"boot","binm1",auto_uido,auto_gidq,0755); + c(home,"boot","binm1+df",auto_uido,auto_gidq,0755); + c(home,"boot","binm2",auto_uido,auto_gidq,0755); + c(home,"boot","binm2+df",auto_uido,auto_gidq,0755); + c(home,"boot","binm3",auto_uido,auto_gidq,0755); + c(home,"boot","binm3+df",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-queue",auto_uidq,auto_gidq,04711); - c(auto_qmail,"bin","qmail-lspawn",auto_uido,auto_gidq,0700); - c(auto_qmail,"bin","qmail-start",auto_uido,auto_gidq,0700); - c(auto_qmail,"bin","qmail-getpw",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-local",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-remote",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-rspawn",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-clean",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-send",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","splogger",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-newu",auto_uido,auto_gidq,0700); - c(auto_qmail,"bin","qmail-newmrh",auto_uido,auto_gidq,0700); - c(auto_qmail,"bin","qmail-pw2u",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-inject",auto_uido,auto_gidq,0755); - 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); - c(auto_qmail,"bin","qmail-showctl",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-qread",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-qstat",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-tcpto",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-tcpok",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-pop3d",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-popup",auto_uido,auto_gidq,0711); - c(auto_qmail,"bin","qmail-qmqpc",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-qmqpd",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-qmtpd",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qmail-smtpd",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","sendmail",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","tcp-env",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qreceipt",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qsmhook",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qbiff",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","forward",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","preline",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","condredirect",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","bouncesaying",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","except",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","maildirmake",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","maildir2mbox",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","maildirwatch",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","qail",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","elq",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","pinq",auto_uido,auto_gidq,0755); + c(home,"doc","FAQ",auto_uido,auto_gidq,0644); + c(home,"doc","UPGRADE",auto_uido,auto_gidq,0644); + c(home,"doc","SENDMAIL",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.alias",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.ctl",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.ids",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.maildir",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.mbox",auto_uido,auto_gidq,0644); + c(home,"doc","INSTALL.vsm",auto_uido,auto_gidq,0644); + c(home,"doc","TEST.deliver",auto_uido,auto_gidq,0644); + c(home,"doc","TEST.receive",auto_uido,auto_gidq,0644); + c(home,"doc","REMOVE.sendmail",auto_uido,auto_gidq,0644); + c(home,"doc","REMOVE.binmail",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.local2alias",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.local2ext",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.local2local",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.local2rem",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.local2virt",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.nullclient",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.relaybad",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.relaygood",auto_uido,auto_gidq,0644); + c(home,"doc","PIC.rem2local",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","addresses.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","addresses.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","envelopes.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","envelopes.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","maildir.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","maildir.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","mbox.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","mbox.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","dot-qmail.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","dot-qmail.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","qmail-control.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","qmail-control.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","qmail-header.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","qmail-header.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","qmail-log.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","qmail-log.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","qmail-users.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","qmail-users.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man5","tcp-environ.5",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat5","tcp-environ.0",auto_uido,auto_gidq,0644); + c(home,"bin","qmail-queue",auto_uidq,auto_gidq,04711); + c(home,"bin","qmail-lspawn",auto_uido,auto_gidq,0700); + c(home,"bin","qmail-start",auto_uido,auto_gidq,0700); + c(home,"bin","qmail-getpw",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-local",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-remote",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-rspawn",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-clean",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-send",auto_uido,auto_gidq,0711); + c(home,"bin","splogger",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-newu",auto_uido,auto_gidq,0700); + c(home,"bin","qmail-newmrh",auto_uido,auto_gidq,0700); + c(home,"bin","qmail-pw2u",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-inject",auto_uido,auto_gidq,0755); + c(home,"bin","predate",auto_uido,auto_gidq,0755); + c(home,"bin","datemail",auto_uido,auto_gidq,0755); + c(home,"bin","mailsubj",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-showctl",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-qread",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-qstat",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-tcpto",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-tcpok",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-pop3d",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-popup",auto_uido,auto_gidq,0711); + c(home,"bin","qmail-qmqpc",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-qmqpd",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-qmtpd",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-smtpd",auto_uido,auto_gidq,0755); + c(home,"bin","qmail-valid-addresses",auto_uido,auto_gidq,0755); + c(home,"bin","sendmail",auto_uido,auto_gidq,0755); + c(home,"bin","tcp-env",auto_uido,auto_gidq,0755); + c(home,"bin","qreceipt",auto_uido,auto_gidq,0755); + c(home,"bin","qsmhook",auto_uido,auto_gidq,0755); + c(home,"bin","qbiff",auto_uido,auto_gidq,0755); + c(home,"bin","forward",auto_uido,auto_gidq,0755); + c(home,"bin","preline",auto_uido,auto_gidq,0755); + c(home,"bin","condredirect",auto_uido,auto_gidq,0755); + c(home,"bin","bouncesaying",auto_uido,auto_gidq,0755); + c(home,"bin","except",auto_uido,auto_gidq,0755); + c(home,"bin","maildirmake",auto_uido,auto_gidq,0755); + c(home,"bin","maildir2mbox",auto_uido,auto_gidq,0755); + c(home,"bin","maildirwatch",auto_uido,auto_gidq,0755); + c(home,"bin","qail",auto_uido,auto_gidq,0755); + c(home,"bin","elq",auto_uido,auto_gidq,0755); + c(home,"bin","pinq",auto_uido,auto_gidq,0755); - c(auto_qmail,"man/man7","forgeries.7",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat7","forgeries.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man7","qmail-limits.7",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat7","qmail-limits.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man7","qmail.7",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat7","qmail.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","addresses.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","addresses.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","envelopes.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","envelopes.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","maildir.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","maildir.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","mbox.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","mbox.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","dot-qmail.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","dot-qmail.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","qmail-control.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","qmail-control.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","qmail-header.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","qmail-header.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","qmail-log.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","qmail-log.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","qmail-users.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","qmail-users.0",auto_uido,auto_gidq,0644); + c(home,"man/man5","tcp-environ.5",auto_uido,auto_gidq,0644); + c(home,"man/cat5","tcp-environ.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","forward.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","forward.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","condredirect.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","condredirect.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","bouncesaying.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","bouncesaying.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","except.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","except.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","maildirmake.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","maildirmake.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","maildir2mbox.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","maildir2mbox.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","maildirwatch.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","maildirwatch.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","mailsubj.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","mailsubj.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","qreceipt.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","qreceipt.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","qbiff.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","qbiff.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","preline.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","preline.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","tcp-env.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","tcp-env.0",auto_uido,auto_gidq,0644); + c(home,"man/man7","forgeries.7",auto_uido,auto_gidq,0644); + c(home,"man/cat7","forgeries.0",auto_uido,auto_gidq,0644); + c(home,"man/man7","qmail-limits.7",auto_uido,auto_gidq,0644); + c(home,"man/cat7","qmail-limits.0",auto_uido,auto_gidq,0644); + c(home,"man/man7","qmail.7",auto_uido,auto_gidq,0644); + c(home,"man/cat7","qmail.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-local.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-local.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-lspawn.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-lspawn.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-getpw.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-getpw.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-remote.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-remote.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-rspawn.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-rspawn.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-clean.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-clean.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-send.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-send.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-start.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-start.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","splogger.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","splogger.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-queue.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-queue.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-inject.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-inject.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-showctl.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-showctl.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-newmrh.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-newmrh.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-newu.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-newu.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-pw2u.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-pw2u.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-qread.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-qread.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-qstat.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-qstat.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-tcpok.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-tcpok.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-tcpto.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-tcpto.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-pop3d.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-pop3d.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-popup.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-popup.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-qmqpc.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-qmqpc.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-qmqpd.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-qmqpd.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-qmtpd.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-qmtpd.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-smtpd.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-smtpd.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man8","qmail-command.8",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat8","qmail-command.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","forward.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","forward.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","condredirect.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","condredirect.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","bouncesaying.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","bouncesaying.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","except.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","except.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","maildirmake.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","maildirmake.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","maildir2mbox.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","maildir2mbox.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","maildirwatch.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","maildirwatch.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","mailsubj.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","mailsubj.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","qreceipt.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","qreceipt.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","qbiff.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","qbiff.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","preline.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","preline.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","tcp-env.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","tcp-env.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"bin","dot-forward",auto_uido,auto_gidq,0755); + c(home,"man/man8","qmail-local.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-local.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-lspawn.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-lspawn.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-getpw.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-getpw.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-remote.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-remote.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-rspawn.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-rspawn.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-clean.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-clean.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-send.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-send.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-start.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-start.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","splogger.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","splogger.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-queue.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-queue.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-inject.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-inject.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-showctl.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-showctl.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-newmrh.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-newmrh.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-newu.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-newu.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-pw2u.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-pw2u.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-qread.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-qread.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-qstat.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-qstat.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-tcpok.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-tcpok.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-tcpto.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-tcpto.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-pop3d.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-pop3d.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-popup.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-popup.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-qmqpc.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-qmqpc.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-qmqpd.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-qmqpd.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-qmtpd.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-qmtpd.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-smtpd.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-smtpd.0",auto_uido,auto_gidq,0644); + c(home,"man/man8","qmail-command.8",auto_uido,auto_gidq,0644); + c(home,"man/cat8","qmail-command.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","dot-forward.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","dot-forward.0",auto_uido,auto_gidq,0644); + c(home,"bin","dot-forward",auto_uido,auto_gidq,0755); - d(auto_qmail,"doc/fastforward",auto_uido,auto_gidq,0755); + c(home,"man/man1","dot-forward.1",auto_uido,auto_gidq,0644); + c(home,"man/cat1","dot-forward.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"bin","fastforward",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","printforward",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","setforward",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","newaliases",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","printmaillist",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","setmaillist",auto_uido,auto_gidq,0755); - c(auto_qmail,"bin","newinclude",auto_uido,auto_gidq,0755); + d(home,"doc/fastforward",auto_uido,auto_gidq,0755); - c(auto_qmail,"doc/fastforward","ALIASES",auto_uido,auto_gidq,0644); + c(home,"bin","fastforward",auto_uido,auto_gidq,0755); + c(home,"bin","printforward",auto_uido,auto_gidq,0755); + c(home,"bin","setforward",auto_uido,auto_gidq,0755); + c(home,"bin","newaliases",auto_uido,auto_gidq,0755); + c(home,"bin","printmaillist",auto_uido,auto_gidq,0755); + c(home,"bin","setmaillist",auto_uido,auto_gidq,0755); + c(home,"bin","newinclude",auto_uido,auto_gidq,0755); - c(auto_qmail,"man/man1","fastforward.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","printforward.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","setforward.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","newaliases.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","printmaillist.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","setmaillist.1",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/man1","newinclude.1",auto_uido,auto_gidq,0644); + c(home,"doc/fastforward","ALIASES",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","fastforward.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","printforward.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","setforward.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","newaliases.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","printmaillist.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","setmaillist.0",auto_uido,auto_gidq,0644); - c(auto_qmail,"man/cat1","newinclude.0",auto_uido,auto_gidq,0644); + c(home,"man/man1","fastforward.1",auto_uido,auto_gidq,0644); + c(home,"man/man1","printforward.1",auto_uido,auto_gidq,0644); + c(home,"man/man1","setforward.1",auto_uido,auto_gidq,0644); + c(home,"man/man1","newaliases.1",auto_uido,auto_gidq,0644); + c(home,"man/man1","printmaillist.1",auto_uido,auto_gidq,0644); + c(home,"man/man1","setmaillist.1",auto_uido,auto_gidq,0644); + c(home,"man/man1","newinclude.1",auto_uido,auto_gidq,0644); + + c(home,"man/cat1","fastforward.0",auto_uido,auto_gidq,0644); + c(home,"man/cat1","printforward.0",auto_uido,auto_gidq,0644); + c(home,"man/cat1","setforward.0",auto_uido,auto_gidq,0644); + c(home,"man/cat1","newaliases.0",auto_uido,auto_gidq,0644); + c(home,"man/cat1","printmaillist.0",auto_uido,auto_gidq,0644); + c(home,"man/cat1","setmaillist.0",auto_uido,auto_gidq,0644); + c(home,"man/cat1","newinclude.0",auto_uido,auto_gidq,0644); } diff --git a/install.c b/install.c index 95034f2..5a4b980 100644 --- a/install.c +++ b/install.c @@ -152,13 +152,18 @@ int mode; strerr_die6sys(111,FATAL,"unable to chmod ",home,"/",file,": "); } -void main() +void main(argc,argv) +int argc; +char *argv[]; { + char *home = 0; + if (argc > 1) + home = argv[1]; fdsourcedir = open_read("."); if (fdsourcedir == -1) strerr_die2sys(111,FATAL,"unable to open current directory: "); umask(077); - hier(); + hier(home); _exit(0); } diff --git a/instcheck.c b/instcheck.c index d41efda..b65031d 100644 --- a/instcheck.c +++ b/instcheck.c @@ -101,8 +101,13 @@ int mode; perm("",home,"/",file,S_IFREG,uid,gid,mode); } -void main() +void main(argc,argv) +int argc; +char *argv[]; { - hier(); + char *home = 0; + if (argc > 1) + home = argv[1]; + hier(home); _exit(0); } diff --git a/mailsubj.sh b/mailsubj.sh index a93d3f4..d465b93 100644 --- a/mailsubj.sh +++ b/mailsubj.sh @@ -4,4 +4,4 @@ shift echo To: ${1+"$@"} echo '' cat -) | QMAIL/bin/qmail-inject +) | /usr/sbin/qmail-inject diff --git a/pinq.sh b/pinq.sh index 93e747a..06847d8 100644 --- a/pinq.sh +++ b/pinq.sh @@ -1 +1 @@ -QMAIL/bin/maildir2mbox && exec pine ${1+"$@"} +/usr/bin/maildir2mbox && exec pine ${1+"$@"} diff --git a/proc+df.sh b/proc+df.sh index eb9e92c..ce61f7e 100644 --- a/proc+df.sh +++ b/proc+df.sh @@ -4,6 +4,6 @@ # Using dot-forward to support sendmail-style ~/.forward files. # Using procmail to deliver messages to /var/spool/mail/$USER by default. -exec env - PATH="QMAIL/bin:$PATH" \ +exec env - PATH="/usr/bin:/usr/sbin$PATH" \ qmail-start '|dot-forward .forward |preline procmail' splogger qmail diff --git a/proc.sh b/proc.sh index 3c76220..88cd1ed 100644 --- a/proc.sh +++ b/proc.sh @@ -3,5 +3,5 @@ # Using splogger to send the log through syslog. # Using procmail to deliver messages to /var/spool/mail/$USER by default. -exec env - PATH="QMAIL/bin:$PATH" \ +exec env - PATH="/usr/bin:/usr/sbin$PATH" \ qmail-start '|preline procmail' splogger qmail diff --git a/qail.sh b/qail.sh index 7e31c33..81e3fdb 100644 --- a/qail.sh +++ b/qail.sh @@ -1 +1 @@ -QMAIL/bin/maildir2mbox && exec Mail ${1+"$@"} +/usr/bin/maildir2mbox && exec Mail ${1+"$@"} diff --git a/qmail-control.9 b/qmail-control.9 index 503ce93..c31050d 100644 --- a/qmail-control.9 +++ b/qmail-control.9 @@ -61,6 +61,7 @@ control default used by .I qmqpservers \fR(none) \fRqmail-qmqpc .I queuelifetime \fR604800 \fRqmail-send .I rcpthosts \fR(none) \fRqmail-smtpd +.I relayhosts \fR(none) \fRqmail-smtpd .I smtpgreeting \fIme \fRqmail-smtpd .I smtproutes \fR(none) \fRqmail-remote .I timeoutconnect \fR60 \fRqmail-remote diff --git a/qmail-local.c b/qmail-local.c index cd01602..ec4e5e7 100644 --- a/qmail-local.c +++ b/qmail-local.c @@ -63,6 +63,51 @@ stralloc ueo = {0}; stralloc cmds = {0}; stralloc messline = {0}; stralloc foo = {0}; +stralloc qsender = {0}; +stralloc tmpline = {0}; +char *verhhost = (char *)0; +char *verhlocal = (char *)0; +int flagheader,flagdobody; +unsigned int i; + +int verhline(sa) +stralloc *sa; +/* substitutes ##L => recipient local, ##H => recipient host if VERP sender */ +/* returns 0 normally, -1 on out-of-memory */ +{ + register char *cp; + char *cpnext,*cpafter; + + if (!verhlocal) return 0; /* no VERP SENDER */ + cp = sa->s; + cpnext = sa->s; + cpafter = cp + sa->len; + tmpline.len = 0; /* clear */ + for (;;) { + while (cp < cpafter && *cp++ != '#'); + if (cp + 1 < cpafter && *cp == '#') { /* found '##' */ + cp++; + if (*cp == 'L') { /* ##L */ + if (!stralloc_catb(&tmpline,cpnext,cp - cpnext - 2)) return -1; + cp++; + cpnext = cp; + if (!stralloc_cats(&tmpline,verhlocal)) return -1; + } else if (*cp == 'H') { /* ##H */ + if (!stralloc_catb(&tmpline,cpnext,cp - cpnext - 2)) return -1; + cp++; + cpnext = cp; + if (!stralloc_cats(&tmpline,verhhost)) return -1; + } + } + if (cp >= cpafter) { + if (tmpline.len) { /* true if we've done any substitutions */ + if (!stralloc_catb(&tmpline,cpnext,cpafter - cpnext)) return -1; + if (!stralloc_copy(sa,&tmpline)) return -1; + } + return 0; + } + } +} char buf[1024]; char outbuf[1024]; @@ -82,6 +127,7 @@ char *dir; char host[64]; char *s; int loop; + int match; struct stat st; int fd; substdio ss; @@ -117,11 +163,27 @@ char *dir; if (substdio_put(&ssout,rpline.s,rpline.len) == -1) goto fail; if (substdio_put(&ssout,dtline.s,dtline.len) == -1) goto fail; - switch(substdio_copy(&ssout,&ss)) - { - case -2: tryunlinktmp(); _exit(4); - case -3: goto fail; - } + flagheader = 1; + flagdobody = 0; + do { /* for VERH */ + if (getln(&ss,&messline,&match,'\n') != 0) + { tryunlinktmp(); _exit(4); } + if (flagheader) { + if (match && messline.len == 1) { + flagheader = 0; + if (!flagdobody) verhlocal = (char *)0; + } + if (messline.s[0] == '#') { /* continue in body */ + flagdobody = 1; /* remove leading '#' */ + for (i = 1; i < messline.len; i++) + messline.s[i - 1] = messline.s[i]; + messline.len--; /* always >= 1 from \n */ + } + } + if (verhlocal) + if (verhline(&messline) == -1) goto fail; + if (substdio_put(&ssout,messline.s,messline.len) == -1) goto fail; + } while (match); if (substdio_flush(&ssout) == -1) goto fail; if (fsync(fd) == -1) goto fail; @@ -193,6 +255,8 @@ char *fn; substdio_fdbuf(&ss,read,0,buf,sizeof(buf)); substdio_fdbuf(&ssout,write,fd,outbuf,sizeof(outbuf)); + flagheader = 1; + flagdobody = 0; if (substdio_put(&ssout,ufline.s,ufline.len)) goto writeerrs; if (substdio_put(&ssout,rpline.s,rpline.len)) goto writeerrs; if (substdio_put(&ssout,dtline.s,dtline.len)) goto writeerrs; @@ -207,6 +271,20 @@ char *fn; if (!match && !messline.len) break; if (gfrom(messline.s,messline.len)) if (substdio_bput(&ssout,">",1)) goto writeerrs; + if (flagheader) { + if (match && messline.len == 1) { + if (!flagdobody) verhlocal = (char *)0; + flagheader = 0; + } + if (messline.s[0] == '#') { /* continue in body */ + flagdobody = 1; /* remove leading '#' */ + for (i = 1; i < messline.len; i++) + messline.s[i - 1] = messline.s[i]; + messline.len--; + } + } + if (verhlocal) + if (verhline(&messline) == -1) goto writeerrs; if (substdio_bput(&ssout,messline.s,messline.len)) goto writeerrs; if (!match) { @@ -276,9 +354,24 @@ char **recips; if (qmail_open(&qqt) == -1) temp_fork(); mailforward_qp = qmail_qp(&qqt); qmail_put(&qqt,dtline.s,dtline.len); + flagheader = 1; do { if (getln(&ss,&messline,&match,'\n') != 0) { qmail_fail(&qqt); break; } + if (flagheader) { + if (match && messline.len == 1) { + flagheader = 0; + if (!flagdobody) verhlocal = (char *)0; + } + if (messline.s[0] == '#') { /* continue in body */ + flagdobody = 1; /* remove leading '#' */ + for (i = 1; i < messline.len; i++) + messline.s[i - 1] = messline.s[i]; + messline.len--; + } + } + if (verhlocal) + if (verhline(&messline) == -1) { qmail_fail(&qqt); break; } qmail_put(&qqt,messline.s,messline.len); } while (match); @@ -458,6 +551,7 @@ char **argv; datetime_sec starttime; int flagforwardonly; char *x; + char *cplast; umask(077); sig_pipeignore(); @@ -518,9 +612,9 @@ char **argv; if (!env_put2("SENDER",sender)) temp_nomem(); - if (!quote2(&foo,sender)) temp_nomem(); + if (!quote2(&qsender,sender)) temp_nomem(); if (!stralloc_copys(&rpline,"Return-Path: <")) temp_nomem(); - if (!stralloc_cat(&rpline,&foo)) temp_nomem(); + if (!stralloc_cat(&rpline,&qsender)) temp_nomem(); for (i = 0;i < rpline.len;++i) if (rpline.s[i] == '\n') rpline.s[i] = '_'; if (!stralloc_cats(&rpline,">\n")) temp_nomem(); @@ -528,6 +622,33 @@ char **argv; if (!stralloc_0(&foo)) temp_nomem(); if (!env_put2("RPLINE",foo.s)) temp_nomem(); + i = byte_rchr(qsender.s,qsender.len,'@'); /* for VERH */ + if (i != qsender.len) { /* got @ */ + cplast = qsender.s + i; + *cplast = '\0'; + if (qsender.s[i = str_rchr(qsender.s,'=')]) { /* got = */ + qsender.s[i] = '\0'; + cplast = qsender.s + i; + verhhost = qsender.s + i + 1; + i = str_rchr(qsender.s,'-'); + if (qsender.s[i] == '-') { + for (;;) { + if (case_starts(qsender.s + i + 1,"return-")) { + verhlocal = qsender.s + i + 9 + str_chr(qsender.s + i + 8,'-'); + /* here to avoid work if not VERP */ + /* verhhost not used if verhlocal=0 */ + for (x = verhlocal; x < cplast; x++) + if (*x == '\n') *x = '_'; /* \n would ruin */ + break; + } + j = byte_rchr(qsender.s,i,'-'); + if (j == i) break; + i = j; + } + } + } + } + if (!stralloc_copys(&ufline,"From ")) temp_nomem(); if (*sender) { diff --git a/qmail-lspawn.c b/qmail-lspawn.c index 5109cc3..f3b91ad 100644 --- a/qmail-lspawn.c +++ b/qmail-lspawn.c @@ -139,7 +139,7 @@ char *local; } if (pipe(pi) == -1) _exit(QLX_SYS); - args[0] = "bin/qmail-getpw"; + args[0] = "/usr/sbin/qmail-getpw"; args[1] = local; args[2] = 0; switch(gpwpid = vfork()) @@ -191,7 +191,7 @@ char *s; char *r; int at; x = nughde.s; xlen = nughde.len; - args[0] = "bin/qmail-local"; + args[0] = "/usr/sbin/qmail-local"; args[1] = "--"; args[2] = x; n = byte_chr(x,xlen,0); if (n++ == xlen) _exit(QLX_USAGE); x += n; xlen -= n; diff --git a/qmail-remote.c b/qmail-remote.c index 7d65473..864dee2 100644 --- a/qmail-remote.c +++ b/qmail-remote.c @@ -189,19 +189,68 @@ char *append; zerodie(); } +stralloc verh = {0}; /* quoted recipient */ +int flagverh; /* argc */ +char *vp; /* argv[3] */ + void blast() { + unsigned int posat, i; + int flagdobody,flagheader; int r; char ch; + posat = 0; /* stays 0 if no VERH */ + flagdobody = 0; /* => 0 at first blank line */ + flagheader = 1; + if (flagverh == 4) { /* only if single recipient */ + if (!quote2(&verh,vp)) temp_nomem(); /* non-canonicalized */ + for (i = 0; i < verh.len; i++) /* \n would destroy message */ + if (verh.s[i] == '\n') verh.s[i] = '_'; + posat = byte_rchr(verh.s,verh.len,'@'); /* posat=0 if no VERH */ + if (posat == verh.len) posat = 0; + } for (;;) { r = substdio_get(&ssin,&ch,1); if (r == 0) break; if (r == -1) temp_read(); if (ch == '.') substdio_put(&smtpto,".",1); + if (flagheader) { + if (ch == '\n') { /* header ends */ + flagheader = 0; + if (!flagdobody) posat = 0; + } else if (ch == '#') { /* # starting line => VERH ... */ + flagdobody = 1; /* continues in body and ... */ + continue; /* character is suppressed. */ + } + } while (ch != '\n') { - substdio_put(&smtpto,&ch,1); + if (ch == '#' && posat) { /* ... # */ + r = substdio_get(&ssin,&ch,1); + if (r == 0) perm_partialline(); + if (r == -1) temp_read(); + if (ch == '#') { /* ... ## */ + register char ch1; + ch1 = *substdio_peek(&ssin); + if (ch1 != 'L' && ch1 != 'H') { /* ... ##x x!=L x!=H */ + substdio_put(&smtpto,"#",1); + continue; + } + r = substdio_get(&ssin,&ch,1); + if (r == 0) perm_partialline(); + if (r == -1) temp_read(); + if (ch == 'L') /* ... ##L */ + substdio_put(&smtpto,verh.s,posat); + else /* ... ##H */ + substdio_put(&smtpto,verh.s + posat + 1,verh.len - posat - 1); + } else { + substdio_put(&smtpto,"#",1); + if (ch == '\n') break; + substdio_put(&smtpto,&ch,1); + } + } else + substdio_put(&smtpto,&ch,1); r = substdio_get(&ssin,&ch,1); if (r == 0) perm_partialline(); if (r == -1) temp_read(); @@ -341,6 +390,8 @@ char **argv; sig_pipeignore(); if (argc < 4) perm_usage(); + flagverh = argc; + vp = argv[3]; if (chdir(auto_qmail) == -1) temp_chdir(); getcontrols(); diff --git a/qmail-send.c b/qmail-send.c index c31b522..6ad0778 100644 --- a/qmail-send.c +++ b/qmail-send.c @@ -55,6 +55,7 @@ stralloc bouncefrom = {0}; stralloc bouncehost = {0}; stralloc doublebounceto = {0}; stralloc doublebouncehost = {0}; +stralloc control_idhost = {0}; char strnum2[FMT_ULONG]; char strnum3[FMT_ULONG]; @@ -694,6 +695,9 @@ unsigned long id; while (!newfield_datemake(now())) nomem(); qmail_put(&qqt,newfield_date.s,newfield_date.len); + while (!newfield_msgidmake(control_idhost.s,control_idhost.len,now())) + nomem(); + qmail_put(&qqt,newfield_msgid.s,newfield_msgid.len); qmail_puts(&qqt,"From: "); while (!quote("ed,&bouncefrom)) nomem(); qmail_put(&qqt,quoted.s,quoted.len); @@ -1453,6 +1457,8 @@ int getcontrols() { if (control_init() == -1) return 0; if (!stralloc_cats(&doublebounceto,"@")) return 0; if (!stralloc_cat(&doublebounceto,&doublebouncehost)) return 0; if (!stralloc_0(&doublebounceto)) return 0; + if (control_rldef(&control_idhost, "control/idhost",1,"idhost") != 1) + return 0; if (control_readfile(&locals,"control/locals",1) != 1) return 0; if (!constmap_init(&maplocals,locals.s,locals.len,0)) return 0; switch(control_readfile(&percenthack,"control/percenthack",0)) diff --git a/qmail-showctl.c b/qmail-showctl.c index a24aa63..5886ab1 100644 --- a/qmail-showctl.c +++ b/qmail-showctl.c @@ -255,6 +255,7 @@ void main() else substdio_puts(subfdout,"Modified recently enough; hopefully up to date.\n"); + do_lst("relayhosts","No relayhosts","Relay host: ",""); do_str("smtpgreeting",1,"smtpgreeting","SMTP greeting: 220 "); do_lst("smtproutes","No artificial SMTP routes.","SMTP route: ",""); do_int("timeoutconnect","60","SMTP client connection timeout is "," seconds"); @@ -290,6 +291,7 @@ void main() if (str_equal(d->d_name,"qmqpservers")) continue; if (str_equal(d->d_name,"queuelifetime")) continue; if (str_equal(d->d_name,"rcpthosts")) continue; + if (str_equal(d->d_name,"relayhosts")) continue; if (str_equal(d->d_name,"smtpgreeting")) continue; if (str_equal(d->d_name,"smtproutes")) continue; if (str_equal(d->d_name,"timeoutconnect")) continue; diff --git a/qmail-smtpd.8 b/qmail-smtpd.8 index c4640b8..d00f339 100644 --- a/qmail-smtpd.8 +++ b/qmail-smtpd.8 @@ -37,6 +37,40 @@ accepts messages that contain long lines or non-ASCII characters, even though such messages violate the SMTP protocol. .SH "CONTROL FILES" .TP 5 +.I addrcheck.cdb +A database of acceptable mailboxes. If present, this is used to report +erroneous RCPT TO commands, which can reduce the amount of junk mail +accepted. It contains an encoding of the virtual domains map +.RB ( \c +.BI V domain +maps to +.IR prefix ), +the local domains +.RB ( \c +.BI @ domain +maps to an empty string), and the available local parts +.RB ( \c +.BI L mailbox +maps to +.B + +if the address is valid or +.B \- +if not). It's best made using +.BR qmail-valid-addresses (8). +.TP 5 +.I addrcheck-delay +Delay in seconds before reporting bad mailbox names after the +.I addrcheck-slow +limit is reached. The default is 2. +.TP 5 +.I addrcheck-limit +Number of bad mailbox names to tolerate before dropping the connection. +Zero means an infinite number. The default is 50. +.TP 5 +.I addrcheck-slow +Number of bad mailbox names to tolerate before imposing delays. The +default is 5. +.TP 5 .I badmailfrom Unacceptable envelope sender addresses. .B qmail-smtpd @@ -128,18 +162,11 @@ is supplied, .B qmail-smtpd will reject any envelope recipient address with a domain not listed in -.IR rcpthosts . - -Exception: -If the environment variable -.B RELAYCLIENT -is set, -.B qmail-smtpd -will ignore -.IR rcpthosts , -and will append the value of -.B RELAYCLIENT -to each incoming recipient address. +.I rcpthosts +unless the sending host is a designated relay client (see the +description of the +.I relayhosts +file beow). .I rcpthosts may include wildcards: @@ -152,6 +179,32 @@ may include wildcards: Envelope recipient addresses without @ signs are always allowed through. .TP 5 +.I relayhosts +Allowed relay clients. Each line is a host-suffix pair, separated by a +colon. If the client's hostname matches one of the hostnames in the +file, that client is permitted to send mail to any host (i.e., to use us +as a relay), and the corresponding suffix is appended to all recipient +addresses generated by the client. + +.I relayhosts +may include wildcards: + +.EX + heaven.af.mil: + .heaven.af.mil: + hell.irs.gov:.irs.virtdomain +.EE + +For historical reasons, the +.B RELAYCLIENT +environment variable overrides this table. If +.B RELAYCLIENT +is set, it has the same effect as there being a matching entry in the +.I relayhosts +file, using the value of +.B RELAYCLIENT +as the suffix. +.TP 5 .I smtpgreeting SMTP greeting message. Default: diff --git a/qmail-smtpd.c b/qmail-smtpd.c index 1e28c88..d2ad504 100644 --- a/qmail-smtpd.c +++ b/qmail-smtpd.c @@ -20,6 +20,7 @@ #include "now.h" #include "exit.h" #include "rcpthosts.h" +#include "addrcheck.h" #include "timeoutread.h" #include "timeoutwrite.h" #include "commands.h" @@ -47,10 +48,12 @@ void die_alarm() { out("451 timeout (#4.4.2)\r\n"); flush(); _exit(1); } void die_nomem() { out("421 out of memory (#4.3.0)\r\n"); flush(); _exit(1); } void die_control() { out("421 unable to read controls (#4.3.0)\r\n"); flush(); _exit(1); } void die_ipme() { out("421 unable to figure out my IP addresses (#4.3.0)\r\n"); flush(); _exit(1); } +void die_badaddr() { out("553 too many bad recipients: sulking (#5.5.1)\r\n"); flush(); _exit(1); } void straynewline() { out("451 See http://pobox.com/~djb/docs/smtplf.html.\r\n"); flush(); _exit(1); } void err_bmf() { out("553 sorry, your envelope sender is in my badmailfrom list (#5.7.1)\r\n"); } void err_nogateway() { out("553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)\r\n"); } +void err_badaddr() { out("553 unknown mailbox (#5.1.1)\r\n"); } void err_unimpl() { out("502 unimplemented (#5.5.1)\r\n"); } void err_syntax() { out("555 syntax error (#5.5.4)\r\n"); } void err_wantmail() { out("503 MAIL first (#5.5.1)\r\n"); } @@ -93,9 +96,17 @@ void dohelo(arg) char *arg; { int liphostok = 0; stralloc liphost = {0}; +int relayhostsok = 0; +stralloc relayhosts = {0}; +struct constmap maprelayhosts; int bmfok = 0; stralloc bmf = {0}; struct constmap mapbmf; +static int ac_slow = 5; +static int ac_limit = 50; +static int ac_delay = 2; +static int ac_count = 0; +static int ac_fd = -1; void setup() { @@ -116,6 +127,23 @@ void setup() if (bmfok == -1) die_control(); if (bmfok) if (!constmap_init(&mapbmf,bmf.s,bmf.len,0)) die_nomem(); + + switch (control_readfile(&relayhosts, "control/relayhosts", 0)) { + case -1: + die_control(); + case 1: + relayhostsok = 1; + if (!constmap_init(&maprelayhosts, relayhosts.s, relayhosts.len, 1)) + die_nomem(); + } + + if (control_readint(&ac_slow, "control/addrcheck-slow") == -1 || + control_readint(&ac_slow, "control/addrcheck-limit") == -1 || + control_readint(&ac_slow, "control/addrcheck-delay") == -1) + die_control(); + + if ((ac_fd = open_read("control/addrcheck.cdb")) < 0 && errno != error_noent) + die_control(); if (control_readint(&databytes,"control/databytes") == -1) die_control(); x = env_get("DATABYTES"); @@ -131,6 +159,18 @@ void setup() if (!remotehost) remotehost = "unknown"; remoteinfo = env_get("TCPREMOTEINFO"); relayclient = env_get("RELAYCLIENT"); + if (!relayclient && relayhostsok) { + int j; + int l = str_len(remotehost); + relayclient = constmap(&maprelayhosts, remotehost, l); + if (!relayclient) for (j = 0; j < l; ++j) { + if (remotehost[j] == '.' && + (relayclient = constmap(&maprelayhosts, + remotehost + j, + l - j)) != 0) + break; + } + } dohelo(remotehost); } @@ -258,6 +298,22 @@ void smtp_rcpt(arg) char *arg; { } else if (!addrallowed()) { err_nogateway(); return; } + if (ac_fd != -1) { + int rc; + if (addrcheck(ac_fd, addr.s, mailfrom.s, &rc) < 0) { + if (errno == error_nomem) + die_nomem(); + else + die_control(); + } + if (!rc) { + ac_count++; + if (ac_limit && ac_count >= ac_limit) die_badaddr(); + if (ac_delay && ac_count >= ac_slow) sleep(ac_delay); + err_badaddr(); + return; + } + } if (!stralloc_cats(&rcptto,"T")) die_nomem(); if (!stralloc_cats(&rcptto,addr.s)) die_nomem(); if (!stralloc_0(&rcptto)) die_nomem(); diff --git a/qmail-valid-addresses b/qmail-valid-addresses new file mode 100644 index 0000000..d43cf85 --- /dev/null +++ b/qmail-valid-addresses @@ -0,0 +1,98 @@ +#! /usr/bin/python + +import os +import cdb +from errno import * + +def sort(l): + l = [] + l + l.sort() + return l +class struct (object): + def __init__(me, **kw): + me.__dict__.update(kw) + def __repr__(me): + return (type(me).__name__ + + '(' + + ', '.join(['%s = %r' % (k, me.__dict__[k]) + for k in me.__dict__ + if k[0] != '_']) + + ')') +class userentry (struct): + pass + +os.chdir('/var/qmail') + +umap = {} +udb = cdb.init('users/cdb') +for k in udb.keys(): + if len(k) == 0 or k[0] != '!': + continue + v = udb[k].split('\0') + u = userentry(user = v[0], uid = int(v[1]), gid = int(v[2]), home = v[3], + dash = v[4], pre = v[5]) + if k[-1] == '\0': + u.name = k[1:-1] + u.wild = 0 + else: + u.name = k[1:] + u.wild = 1 + umap[u.name] = u +del udb + +map = {} +def addlocal(u, p, l, forcep = False): + l = 'L' + l + if not os.path.exists(p): + if forcep: + map[l] = '+' + return + f = open(p) + top = f.readline() + f.close() + if len(top) > 1 and top[0:2] == '#!': + map[l] = '-' + elif len(top) > 1 and top[0:2] == '#?': + name = u.name + if name[-1] == '-': + name = name[:-1] + map[l] = '?' + name + else: + map[l] = '+' +for k in sort(umap.keys()): + u = umap[k] + qm = '.qmail' + u.dash + u.pre + qmlen = len(qm) + if u.wild: + for p in os.listdir(u.home): + if not p.startswith(qm): + continue + ext = p[qmlen:] + addlocal(u, os.path.join(u.home, p), u.name + ext) + else: + addlocal(u, os.path.join(u.home, qm), u.name, u.dash == '') + +me = open('control/me').readline() + +try: + for dom in open('control/locals'): + if len(dom) and dom[-1] == '\n': + dom = dom[:-1] + map['@' + dom] = '' +except IOError, exc: + if exc.errno != ENOENT: + raise + map['@' + me] = '' + +try: + for v in open('control/virtualdomains'): + if len(v) and v[-1] == '\n': + v = v[:-1] + (addr, pre) = v.split(':', 2) + map['V' + addr] = pre +except IOError, exc: + if exc.errno != ENOENT: + raise + +for l in sort(map.keys()): + print '%s:%s' % (l, map[l]) diff --git a/qmail-valid-addresses.8 b/qmail-valid-addresses.8 new file mode 100644 index 0000000..46dae31 --- /dev/null +++ b/qmail-valid-addresses.8 @@ -0,0 +1,20 @@ +.TH qmail-valid-addresses 8 +.SH NAME +qmail-valid-addresses \- prepare addresses for use with qmail-smtpd +.SH SYNOPSIS +.B qmail-valid-addresses +.SH DESCRIPTION +.B qmail-valid-addresses +scans the +.B users/cdb +file, and the +.B local +and +.B virtualdomain +control files, and emits a textual representation of the required +.I addrcheck +database in a form acceptable to +.BR cdb-map (8). +.SH "SEE ALSO" +qmail-smtpd(8), +cdb-map(1). diff --git a/qmail.c b/qmail.c index 0fe0dfa..9432b4b 100644 --- a/qmail.c +++ b/qmail.c @@ -6,8 +6,17 @@ #include "fd.h" #include "qmail.h" #include "auto_qmail.h" +#include "env.h" -static char *binqqargs[2] = { "bin/qmail-queue", 0 } ; +static char *binqqargs[2] = { 0, 0 } ; + +static void setup_qqargs() +{ + if(!binqqargs[0]) + binqqargs[0] = env_get("QMAILQUEUE"); + if(!binqqargs[0]) + binqqargs[0] = "/usr/sbin/qmail-queue"; +} int qmail_open(qq) struct qmail *qq; @@ -15,6 +24,8 @@ struct qmail *qq; int pim[2]; int pie[2]; + setup_qqargs(); + if (pipe(pim) == -1) return -1; if (pipe(pie) == -1) { close(pim[0]); close(pim[1]); return -1; } diff --git a/sendmail.c b/sendmail.c index 46d0e4b..d7e3ae3 100644 --- a/sendmail.c +++ b/sendmail.c @@ -19,7 +19,7 @@ void die_usage() _exit(100); } -char *smtpdarg[] = { "bin/qmail-smtpd", 0 }; +char *smtpdarg[] = { "/usr/sbin/qmail-smtpd", 0 }; void smtpd() { if (!env_get("PROTO")) { @@ -37,7 +37,7 @@ void smtpd() _exit(111); } -char *qreadarg[] = { "bin/qmail-qread", 0 }; +char *qreadarg[] = { "/usr/sbin/qmail-qread", 0 }; void mailq() { execv(*qreadarg,qreadarg); @@ -113,7 +113,7 @@ char **argv; if (!qiargv) nomem(); arg = qiargv; - *arg++ = "bin/qmail-inject"; + *arg++ = "/usr/sbin/qmail-inject"; *arg++ = (flagh ? "-H" : "-a"); if (sender) { *arg++ = "-f";