Merge branches 'idx/verh' and 'idx/qmqpc'
authorMark Wooding <mdw@distorted.org.uk>
Tue, 14 Feb 2006 15:55:38 +0000 (15:55 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 14 Feb 2006 15:55:38 +0000 (15:55 +0000)
* idx/verh:
  [PATCH] Rewrite ##X tags in headers of incoming messages

* idx/qmqpc:
  [PATCH] qmqpc: Read servers from the command line.

59 files changed:
.gitignore [new file with mode: 0644]
Makefile
TARGETS
addrcheck.c [new file with mode: 0644]
addrcheck.h [new file with mode: 0644]
binm1+df.sh
binm1.sh
binm2+df.sh
binm2.sh
binm3+df.sh
binm3.sh
conf-cc
conf-groups
conf-ld
datemail.sh
debian/.gitignore [new file with mode: 0644]
debian/README [new file with mode: 0644]
debian/README.debian [new file with mode: 0644]
debian/TODO [new file with mode: 0644]
debian/build-qmail [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/conffiles [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/debianize-binary-tree [new file with mode: 0644]
debian/debianize-source-tree [new file with mode: 0644]
debian/postinst [new file with mode: 0644]
debian/postrm [new file with mode: 0644]
debian/preinst [new file with mode: 0644]
debian/prerm [new file with mode: 0644]
debian/qmail [new file with mode: 0644]
debian/qmail-src.README [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/suid [new file with mode: 0644]
elq.sh
error.h
hier.c
home+df.sh
home.sh
install-big.c
install.c
instcheck.c
mailsubj.sh
pinq.sh
proc+df.sh
proc.sh
qail.sh
qmail-control.9
qmail-lspawn.c
qmail-qmqpc.8
qmail-qmqpc.c
qmail-send.c
qmail-showctl.c
qmail-smtpd.8
qmail-smtpd.c
qmail-valid-addresses [new file with mode: 0644]
qmail-valid-addresses.8 [new file with mode: 0644]
qmail.c
sendmail.c

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..f4c3f19
--- /dev/null
@@ -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
index 9230887..f3d8ebd 100644 (file)
--- 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 (file)
--- 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 (file)
index 0000000..08d29b9
--- /dev/null
@@ -0,0 +1,236 @@
+#include "cdb.h"
+#include "stralloc.h"
+#include "byte.h"
+#include "str.h"
+#include "addrcheck.h"
+#include <errno.h>
+#include <unistd.h>
+
+/* #define DEBUG */
+#ifdef DEBUG
+#  define D(x) x
+#  include <stdio.h>
+#  include <sys/types.h>
+#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 <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+
+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 (file)
index 0000000..b4bc555
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef ADDRCHECK_H
+#define ADDRCHECK_H
+
+extern int addrcheck(int, const char *, const char *, int *);
+
+#endif
index 0ff1a68..f18ceaf 100644 (file)
@@ -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
index db79cbd..03e5a80 100644 (file)
--- 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
index 4f78101..0eeae2d 100644 (file)
@@ -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
index 7905308..5224189 100644 (file)
--- 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
index 3d69401..686be30 100644 (file)
@@ -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
index eb139e6..e2f9254 100644 (file)
--- 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 (file)
--- a/conf-cc
+++ b/conf-cc
@@ -1,3 +1,3 @@
-cc -O2
+cc -O2 -g
 
 This will be used to compile .c files.
index cec0845..0c42455 100644 (file)
@@ -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 (file)
--- a/conf-ld
+++ b/conf-ld
@@ -1,3 +1,4 @@
+cc
 cc -s
 
 This will be used to link .o files into an executable.
index fd28f46..caa2c42 100644 (file)
@@ -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 (file)
index 0000000..2caa678
--- /dev/null
@@ -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 (file)
index 0000000..6ff1a99
--- /dev/null
@@ -0,0 +1,7 @@
+Things to do when debianizing a new version of qmail.
+ Christian Hudon <chrish@debian.org>
+
+* 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 (file)
index 0000000..f5a17bd
--- /dev/null
@@ -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/<username>
+
+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 <phil@hands.com>
diff --git a/debian/TODO b/debian/TODO
new file mode 100644 (file)
index 0000000..432d76b
--- /dev/null
@@ -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 (file)
index 0000000..dfcf28b
--- /dev/null
@@ -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 (file)
index 0000000..c85d4b9
--- /dev/null
@@ -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 <mdw@nsict.org>  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 <mdw@nsict.org>  Wed, 1 Oct 2003 01:16:00 +0100
+
+qmail (1.03-3) non-free; urgency=low
+  
+  * fix uids for new standards.
+  
+ -- Mark Wooding <mdw@nsict.org>  Tue, 14 Oct 2000 08:37:50 +0100
+
+qmail (1.03-2) non-free; urgency=low
+
+  * add message-id to bounces.
+
+ -- Mark Wooding <mdw@nsict.org>  Tue,  8 Jun 1999 19:37:43 +0100
+
+qmail (1.03-1) non-free; urgency=low
+
+  * new upstream release
+
+ -- Mark Wooding <mdw@excessus.demon.co.uk>  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 <phil@hands.com>  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 <chrish@debian.org>  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 <chrish@debian.org>  Sun, 13 Apr 1997 19:12:59 -0400
+
+qmail (1.00-1) experimental; urgency=low
+
+  * Initial release.
+
+ -- Christian Hudon <chrish@debian.org>  Wed, 26 Mar 1997 00:24:38 -0500
diff --git a/debian/conffiles b/debian/conffiles
new file mode 100644 (file)
index 0000000..49c92fe
--- /dev/null
@@ -0,0 +1 @@
+/etc/init.d/qmail
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..ac47580
--- /dev/null
@@ -0,0 +1,84 @@
+Source: qmail
+Maintainer: Mark Wooding <mdw@distorted.org.uk>
+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 (file)
index 0000000..4ba0bb1
--- /dev/null
@@ -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.
+<phil@hands.com>
diff --git a/debian/debianize-binary-tree b/debian/debianize-binary-tree
new file mode 100644 (file)
index 0000000..e3c062d
--- /dev/null
@@ -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 (file)
index 0000000..648e8ab
--- /dev/null
@@ -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 >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 (file)
index 0000000..bb0db8b
--- /dev/null
@@ -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 = <STDIN>;
+       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 (file)
index 0000000..0e5686f
--- /dev/null
@@ -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 (file)
index 0000000..e9e2848
--- /dev/null
@@ -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, '</etc/inetd.conf' or die "Could not open /etc/inetd.conf\n";
+    open N, ">$new_inetd" or die "Could not create $new_inetd\n";
+    while (<I>) {
+       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 (file)
index 0000000..44d0663
--- /dev/null
@@ -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 <<EOT;
+There are still messages in qmail's queue. You probably want to wait until
+qmail's queue is empty before removing the qmail package. Otherwise 
+the messages currently waiting in the queue will not be delivered or will be 
+lost. (\`qmail-qstat' will tell you the number of messages in qmail's queue.)
+
+EOT
+
+        print STDERR 'Do you still want to proceed and remove the qmail package? [y/N] ';
+       my $answer = <STDIN>;
+       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 (file)
index 0000000..55e7faa
--- /dev/null
@@ -0,0 +1,90 @@
+#!/bin/sh
+#
+# /etc/init.d/qmail : start or stop the qmail mail subsystem.
+#
+# Written by Christian Hudon <chrish@debian.org>
+
+#
+# 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 (file)
index 0000000..f6250c3
--- /dev/null
@@ -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 <phil@hands.com>
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..b9ceed6
--- /dev/null
@@ -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 (file)
index 0000000..cfb931e
--- /dev/null
@@ -0,0 +1 @@
+off
diff --git a/elq.sh b/elq.sh
index 7e20262..22a327d 100644 (file)
--- 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 (file)
--- a/error.h
+++ b/error.h
@@ -1,7 +1,7 @@
 #ifndef ERROR_H
 #define ERROR_H
 
-extern int errno;
+#include <errno.h>
 
 extern int error_intr;
 extern int error_nomem;
diff --git a/hier.c b/hier.c
index 28e568d..0c692f7 100644 (file)
--- 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);
 }
index 7885cdf..591dc2e 100644 (file)
@@ -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 (file)
--- 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
index df813df..a390e03 100644 (file)
@@ -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);
 }
index 95034f2..5a4b980 100644 (file)
--- 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);
 }
index d41efda..b65031d 100644 (file)
@@ -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);
 }
index a93d3f4..d465b93 100644 (file)
@@ -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 (file)
--- a/pinq.sh
+++ b/pinq.sh
@@ -1 +1 @@
-QMAIL/bin/maildir2mbox && exec pine ${1+"$@"}
+/usr/bin/maildir2mbox && exec pine ${1+"$@"}
index eb9e92c..ce61f7e 100644 (file)
@@ -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 (file)
--- 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 (file)
--- a/qail.sh
+++ b/qail.sh
@@ -1 +1 @@
-QMAIL/bin/maildir2mbox && exec Mail ${1+"$@"}
+/usr/bin/maildir2mbox && exec Mail ${1+"$@"}
index 503ce93..c31050d 100644 (file)
@@ -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
index 5109cc3..f3b91ad 100644 (file)
@@ -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;
index e11a15e..d8fbbb5 100644 (file)
@@ -3,6 +3,9 @@
 qmail-qmqpc \- queue a mail message via QMQP
 .SH SYNOPSIS
 .B qmail-qmqpc
+[
+.I server
+[...] ]
 .SH DESCRIPTION
 .B qmail-qmqpc
 offers the same interface as
@@ -16,6 +19,13 @@ installation,
 .B qmail-queue
 is replaced with a symbolic link to
 .BR qmail-qmqpc .
+
+If one or more server IP addresses 
+are specified on the command line,
+.B qmail-qmqpc
+will ignore the control files and instead use the QMQP servers specified on the
+command line.
+
 .SH "CONTROL FILES"
 .TP 5
 .I qmqpservers
@@ -23,6 +33,7 @@ IP addresses of QMQP servers, one address per line.
 .B qmail-qmqpc
 will try each address in turn until it establishes a QMQP connection
 or runs out of addresses.
+
 .SH "SEE ALSO"
 qmail-control(5),
 qmail-queue(8),
index d5adf05..88de856 100644 (file)
@@ -135,25 +135,36 @@ char *server;
 
 stralloc servers = {0};
 
-main()
+main(argc,argv)
+int argc;
+char **argv;
 {
   int i;
   int j;
 
   sig_pipeignore();
 
-  if (chdir(auto_qmail) == -1) die_home();
-  if (control_init() == -1) die_control();
-  if (control_readfile(&servers,"control/qmqpservers",0) != 1) die_control();
+  if (!argv[1]) {              /* std behavior */
+    if (chdir(auto_qmail) == -1) die_home();
+    if (control_init() == -1) die_control();
+    if (control_readfile(&servers,"control/qmqpservers",0) != 1) die_control();
 
-  getmess();
+    getmess();
 
-  i = 0;
-  for (j = 0;j < servers.len;++j)
-    if (!servers.s[j]) {
-      doit(servers.s + i);
-      i = j + 1;
-    }
+    i = 0;
+    for (j = 0;j < servers.len;++j)
+      if (!servers.s[j]) {
+       doit(servers.s + i);
+       i = j + 1;
+      }
+  } else {                     /* servers on cmd line */
+
+    getmess();
+
+    i = 1;
+    while (argv[i])
+      doit(argv[i++]);
+  }
 
   _exit(lasterror);
 }
index c31b522..6ad0778 100644 (file)
@@ -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(&quoted,&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))
index a24aa63..5886ab1 100644 (file)
@@ -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;
index c4640b8..d00f339 100644 (file)
@@ -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:
index 1e28c88..d2ad504 100644 (file)
@@ -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 (file)
index 0000000..d43cf85
--- /dev/null
@@ -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 (file)
index 0000000..46dae31
--- /dev/null
@@ -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 (file)
--- 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; }
  
index 46d0e4b..d7e3ae3 100644 (file)
@@ -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";