1
0
Fork 0

qmail 1.03

This commit is contained in:
D. J. Bernstein 1998-06-15 12:53:00 +02:00 committed by Rolf Eike Beer
parent d15ee51c9d
commit f5df10d173
43 changed files with 1675 additions and 1010 deletions

24
BIN.Makefile Normal file
View file

@ -0,0 +1,24 @@
SHELL=/bin/sh
# Files are edited in the installation directory, then copied.
# There are 40 arguments to idedit after the filename,
# showing the positions of each byte in the following ten ints:
# uida, uidd, uidl, uido, uidp, uidq, uidr, uids, gidq, gidn.
# Normal little-endian positions are n n+1 n+2 ... n+39 for some n.
# Normal big-endian positions are n+3 n+2 n+1 n n+7 ... n+36 for some n.
setup:
mkdir /var/qmail
./idedit install-big XXX
./idedit qmail-lspawn XXX
./idedit qmail-queue XXX
./idedit qmail-rspawn XXX
./idedit qmail-showctl XXX
./idedit qmail-start XXX
./install-big
cp /var/qmail/boot/binm1+df /var/qmail/rc
chmod 755 /var/qmail/rc
echo '|fastforward -d /etc/aliases.cdb' > /var/qmail/alias/.qmail-default
chmod 644 /var/qmail/alias/.qmail-default
hostname | grep -q '\.'
./config-fast `hostname`

19
BIN.README Normal file
View file

@ -0,0 +1,19 @@
Like any other piece of software (and information generally), qmail
comes with NO WARRANTY.
Configuration: The qmail home directory is /var/qmail. (This must be a
local directory, not shared among machines. Under Linux, make sure that
all mail-handling filesystems are mounted with synchronous metadata.)
The user-ext delimiter is -. The silent concurrency limit is 120. The
queue subdirectory split is 23.
To install:
# make setup
To set up qmail to receive and deliver mail, follow the instructions in
/var/qmail/doc/fastforward/ALIASES, and then start at step 9 of
/var/qmail/doc/INSTALL.
Compilation environment: Oops, the package creator forgot to edit this!
He's supposed to list his OS version, compiler version, hardware, and
name.

2
BLURB3
View file

@ -83,7 +83,7 @@ Local delivery (qmail-local):
* user-controlled program delivery: procmail etc. (qmail-command) * user-controlled program delivery: procmail etc. (qmail-command)
* optional new-mail notification (qbiff) * optional new-mail notification (qbiff)
* optional NRUDT return receipts (qreceipt) * optional NRUDT return receipts (qreceipt)
* conditional filtering (condredirect) * conditional filtering (condredirect, bouncesaying)
POP3 service (qmail-popup, qmail-pop3d): POP3 service (qmail-popup, qmail-pop3d):
* RFC 1939 * RFC 1939

39
CHANGES
View file

@ -1,3 +1,42 @@
19980615 version: qmail 1.03.
19980614 doc: eliminated BIN.setup in favor of a web page.
19980614 code: added other auto* to qmail-showctl output.
19980614 doc: added pointer to immhf.html in qmail-header.5.
19980614 doc: added note to TEST.receive about SMTP command format.
19980614 doc: added FAQ 5.6 on qmail-qmqpd.
19980614 code: removed unused variables in idedit.c.
19980613 code: changed conf-patrn to 002.
19980613 doc: moved SENDMAIL lower in INSTALL.
19980612 code: added install-big.
19980612 code: added BIN.Makefile.
19980612 doc: added BIN.README, BIN.setup.
19980612 code: switched to new install.
19980611 code: added idedit.
19980611 doc: added FAQ 1.3 on $QMAILMFTFILE.
19980611 doc: used bouncesaying in FAQ 5.5.
19980611 code: added except.
19980611 code: added bouncesaying.
19980611 code: allowed unbracketed IP addresses in dns_ipplus() and
dns_mxip().
19980611 code: allowed spaces after colon in non-bracketed addresses in
qmail-smtpd.
19980611 doc: cleaned up UPGRADE.
19980528 bug: qmail-smtpd skips first character in rcpthosts() call.
tnx NND. impact: qmail-smtpd crashes on empty address; and it
allows relaying to ""@any.host. fix: use addr.s.
19980515 doc: expanded flock discussion in INSTALL.mbox.
19980515 doc: eliminated flock warning from INSTALL.maildir.
19980515 doc: split REMOVE.binmail out of INSTALL.
19980515 doc: split REMOVE.sendmail out of INSTALL.
19980515 doc: split TEST.deliver and TEST.receive out of INSTALL and
UPGRADE.
19980515 doc: integrated INSTALL.boot into INSTALL.
19980515 code: cleaned up final output in qmail-qmqpd.c.
19980514 doc: updated procmail notes in INSTALL.mbox. tnx JRM.
19980514 doc: changed FAQ 4.4 to point to INSTALL.mbox for procmail.
tnx JRM.
19980514 code: separated HELO and EHLO; single-line response for HELO.
tnx to various people.
19980430 version: qmail 1.02. 19980430 version: qmail 1.02.
19980430 doc: updated SECURITY. 19980430 doc: updated SECURITY.
19980430 doc: fixed FAQ 4.9. tnx KB. 19980430 doc: fixed FAQ 4.9. tnx KB.

42
FAQ
View file

@ -1,6 +1,7 @@
1. Controlling the appearance of outgoing messages 1. Controlling the appearance of outgoing messages
1.1. How do I set up host masquerading? 1.1. How do I set up host masquerading?
1.2. How do I set up user masquerading? 1.2. How do I set up user masquerading?
1.3. How do I set up Mail-Followup-To automatically?
2. Routing outgoing messages 2. Routing outgoing messages
2.1. How do I send local messages to another host? 2.1. How do I send local messages to another host?
@ -32,6 +33,7 @@
5.3. How do I set up qmail-pop3d? 5.3. How do I set up qmail-pop3d?
5.4. How do I allow selected clients to use this host as a relay? 5.4. How do I allow selected clients to use this host as a relay?
5.5. How do I fix up messages from broken SMTP clients? 5.5. How do I fix up messages from broken SMTP clients?
5.6. How do I set up qmail-qmqpd?
6. Configuring MUAs to work with qmail 6. Configuring MUAs to work with qmail
6.1. How do I make BSD mail generate a Date with the local time zone? 6.1. How do I make BSD mail generate a Date with the local time zone?
@ -75,6 +77,14 @@ override From lines supplied by your MUA, add QMAILINJECT=f to your
environment. environment.
1.3. How do I set up Mail-Followup-To automatically? When I send a
message to the sos@heaven.af.mil mailing list, I'd like to include
``Mail-Followup-To: sos@heaven.af.mil''.
Answer: Add QMAILMFTFILE=$HOME/.lists to your environment, and put
sos@heaven.af.mil into ~/.lists.
2. Routing outgoing messages 2. Routing outgoing messages
@ -226,8 +236,8 @@ Answer: Put
into ~/.qmail. You'll have to use a full path for procmail unless into ~/.qmail. You'll have to use a full path for procmail unless
procmail is in the system's startup PATH. Note that procmail will try to procmail is in the system's startup PATH. Note that procmail will try to
deliver to /usr/spool/mail/$USER by default; to change this, change deliver to /var/spool/mail/$USER by default; to change this, see
SYSTEM_MBOX in procmail's config.h. INSTALL.mbox.
4.5. How do I use elm's filter with qmail? 4.5. How do I use elm's filter with qmail?
@ -333,7 +343,7 @@ If you have tcpserver installed, skip the inetd step, and set up
tcpserver -u 7770 -g 2108 0 qmtp /var/qmail/bin/qmail-qmtpd & tcpserver -u 7770 -g 2108 0 qmtp /var/qmail/bin/qmail-qmtpd &
replacing 7770 and 2108 with the qmaild uid and nofiles gid. See replacing 7770 and 2108 with the qmaild uid and nofiles gid. See
question 5.1 for more details. question 5.1 for more details on tcpserver.
5.3. How do I set up qmail-pop3d? My old POP server works with mbox 5.3. How do I set up qmail-pop3d? My old POP server works with mbox
@ -362,7 +372,7 @@ lines)
/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir & /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &
replacing YOURHOST with your host's fully qualified domain name. See replacing YOURHOST with your host's fully qualified domain name. See
question 5.1 for more details. question 5.1 for more details on tcpserver.
Security note: pop3d should be used only within a secure network; Security note: pop3d should be used only within a secure network;
otherwise an eavesdropper can steal passwords. otherwise an eavesdropper can steal passwords.
@ -411,7 +421,7 @@ after tcpserver in your qmail-smtpd invocation.
Answer: Three steps. First, put Answer: Three steps. First, put
| [ "@$HOST" = "@fixme" ] || ( echo Permission denied; exit 100 ) | bouncesaying 'Permission denied' [ "@$HOST" != "@fixme" ]
| qmail-inject -f "$SENDER" -- "$DEFAULT" | qmail-inject -f "$SENDER" -- "$DEFAULT"
into ~alias/.qmail-fixup-default. Second, put into ~alias/.qmail-fixup-default. Second, put
@ -433,6 +443,28 @@ tcpserver instead of inetd and tcpd, put
into /etc/tcp.smtp, and run tcprules as in question 5.4. into /etc/tcp.smtp, and run tcprules as in question 5.4.
5.6. How do I set up qmail-qmqpd? I'd like to allow fast queueing of
outgoing mail from authorized clients.
Answer: Make sure you have installed tcpserver 0.80 or above. Create
/etc/qmqp.tcp in tcprules format to allow connections from authorized
hosts. For example, if queueing is allowed from 1.2.3.*:
1.2.3.:allow
:deny
Convert /etc/qmqp.tcp to /etc/qmqp.cdb:
tcprules /etc/qmqp.cdb /etc/qmqp.tmp < /etc/qmqp.tcp
Finally, set up
tcpserver -x /etc/qmqp.cdb -u 7770 -g 2108 0 628 /var/qmail/bin/qmail-qmqpd &
replacing 7770 and 2108 with the qmaild uid and nofiles gid. See
question 5.1 for more details on tcpserver.
6. Configuring MUAs to work with qmail 6. Configuring MUAs to work with qmail

15
FILES
View file

@ -6,12 +6,15 @@ README
FAQ FAQ
INSTALL INSTALL
INSTALL.alias INSTALL.alias
INSTALL.boot
INSTALL.ctl INSTALL.ctl
INSTALL.ids INSTALL.ids
INSTALL.maildir INSTALL.maildir
INSTALL.mbox INSTALL.mbox
INSTALL.vsm INSTALL.vsm
REMOVE.sendmail
REMOVE.binmail
TEST.deliver
TEST.receive
UPGRADE UPGRADE
THOUGHTS THOUGHTS
TODO TODO
@ -34,6 +37,9 @@ VERSION
SYSDEPS SYSDEPS
TARGETS TARGETS
Makefile Makefile
BIN.README
BIN.Makefile
idedit.c
conf-break conf-break
auto_break.h auto_break.h
conf-spawn conf-spawn
@ -49,6 +55,8 @@ auto_uids.h
auto_usera.h auto_usera.h
extra.h extra.h
addresses.5 addresses.5
except.1
bouncesaying.1
condredirect.1 condredirect.1
dot-qmail.9 dot-qmail.9
envelopes.5 envelopes.5
@ -99,7 +107,6 @@ config.sh
config-fast.sh config-fast.sh
qmail-clean.c qmail-clean.c
qmail-getpw.c qmail-getpw.c
qmail-hier.c
qmail-inject.c qmail-inject.c
qmail-local.c qmail-local.c
qmail-lspawn.c qmail-lspawn.c
@ -138,6 +145,8 @@ qbiff.c
forward.c forward.c
preline.c preline.c
predate.c predate.c
except.c
bouncesaying.c
condredirect.c condredirect.c
maildirmake.c maildirmake.c
maildir2mbox.c maildir2mbox.c
@ -202,8 +211,10 @@ auto-int.c
auto-int8.c auto-int8.c
auto-gid.c auto-gid.c
auto-uid.c auto-uid.c
hier.c
install.c install.c
instcheck.c instcheck.c
install-big.c
alloc.3 alloc.3
alloc.h alloc.h
alloc.c alloc.c

205
INSTALL
View file

@ -12,7 +12,7 @@ directory, edit conf-qmail now.
names, edit conf-users and conf-groups now. names, edit conf-users and conf-groups now.
Installation steps that won't interfere with sendmail: To create /var/qmail and configure qmail (won't interfere with sendmail):
1. Create the qmail home directory: 1. Create the qmail home directory:
# mkdir /var/qmail # mkdir /var/qmail
@ -21,193 +21,64 @@ Installation steps that won't interfere with sendmail:
users before compiling the programs. users before compiling the programs.
3. Compile the programs and create the qmail directory tree: 3. Compile the programs and create the qmail directory tree:
# make setup # make setup check
4. Run instcheck to make sure it doesn't print any warnings: 4. Read INSTALL.ctl and FAQ. Minimal survival command:
# make check
5. Read INSTALL.ctl and FAQ. Minimal survival command:
# ./config # ./config
6. Read INSTALL.alias. Minimal survival command: 5. Read INSTALL.alias. Minimal survival command:
# (cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root) # (cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root)
# chmod 644 ~alias/.qmail* # chmod 644 ~alias/.qmail*
7. Read INSTALL.mbox and INSTALL.vsm. 6. Read INSTALL.mbox and INSTALL.vsm.
8. Read INSTALL.maildir. 7. Read INSTALL.maildir.
9. Read SENDMAIL. This is what your users will want to know about the 8. Copy /var/qmail/boot/home (or proc) to /var/qmail/rc.
To test qmail deliveries (won't interfere with sendmail):
9. Enable deliveries of messages injected into qmail:
# csh -cf '/var/qmail/rc &'
10. Read TEST.deliver.
To upgrade from sendmail to qmail:
11. Read SENDMAIL. This is what your users will want to know about the
switch from sendmail to qmail. switch from sendmail to qmail.
10. Copy /var/qmail/boot/home (or proc) to /var/qmail/rc. 12. Read REMOVE.sendmail. You must remove sendmail before installing
qmail.
13. Read REMOVE.binmail.
Pre-upgrade tests: 14. Add
csh -cf '/var/qmail/rc &'
to your boot scripts, so that the qmail daemons are restarted
whenever your system reboots. Make sure you include the &.
11. Enable deliveries of messages injected into qmail: 15. Make qmail's ``sendmail'' wrapper available to MUAs:
# /var/qmail/rc &
12. Look for a
qmail: status: local 0/10 remote 0/20
line in syslog. qmail-send always prints either ``cannot start'' or
``status''. (The big number is a splogger timestamp.)
13. Do a ps and look for the qmail daemons. There should be four of
them, all idle: qmail-send, running as qmails; qmail-lspawn, running
as root; qmail-rspawn, running as qmailr; and qmail-clean, running
as qmailq. You will also see splogger, running as qmaill.
14. Local-local test: Send yourself an empty message. (Replace ``me''
with your username. Make sure to include the ``to:'' colon.)
% echo to: me | /var/qmail/bin/qmail-inject
The message will show up immediately in your mailbox, and syslog
will show something like this:
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20345 uid 666
qmail: starting delivery 1: msg 53 to local me@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 1: success: did_1+0+0/
qmail: status: local 0/10 remote 0/20
qmail: end msg 53
(53 is an inode number; 20345 is a process ID; your numbers will
probably be different.)
15. Local-error test: Send a message to a nonexistent local address.
% echo to: nonexistent | /var/qmail/bin/qmail-inject
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20351 uid 666
qmail: starting delivery 2: msg 53 to local nonexistent@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 2: failure: No_such_address.__#5.1.1_/
qmail: status: local 0/10 remote 0/20
qmail: bounce msg 53 qp 20357
qmail: end msg 53
qmail: new msg 54
qmail: info msg 54: bytes 743 from <> qp 20357 uid 666
qmail: starting delivery 3: msg 54 to local me@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 3: success: did_1+0+0/
qmail: status: local 0/10 remote 0/20
qmail: end msg 54
You will now have a bounce message in your mailbox.
16. Local-remote test: Send an empty message to your account on another
machine.
% echo to: me@wherever | /var/qmail/bin/qmail-inject
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20372 uid 666
qmail: starting delivery 4: msg 53 to remote me@wherever
qmail: status: local 0/10 remote 1/20
qmail: delivery 4: success: 1.2.3.4_accepted_message./...
qmail: status: local 0/10 remote 0/20
qmail: end msg 53
There will be a pause between ``starting delivery'' and ``success'';
SMTP is slow. Check that the message is in your mailbox on the other
machine.
17. Local-postmaster test: Send mail to postmaster, any capitalization.
% echo to: POSTmaster | /var/qmail/bin/qmail-inject
Look for the message in the alias mailbox, normally ~alias/Mailbox.
18. Double-bounce test: Send a message with a completely bad envelope.
% /var/qmail/bin/qmail-inject -f nonexistent
To: unknownuser
Subject: testing
This is a test. This is only a test.
%
(Use end-of-file, not dot, to end the message.) Look for the double
bounce in the alias mailbox.
19. Group membership test:
% cat > ~me/.qmail-groups
|groups >> MYGROUPS; exit 0
% /var/qmail/bin/qmail-inject me-groups < /dev/null
% cat ~me/MYGROUPS
MYGROUPS will show your normal gid and nothing else. (Under Solaris,
make sure to use /usr/ucb/groups; /usr/bin/groups is broken.)
Upgrading from sendmail to qmail:
20. Read INSTALL.boot. You must replace the sendmail invocation in your
boot scripts with an appropriate qmail invocation.
21. Kill the sendmail daemon. You should first kill -STOP the daemon; if
any children are running, you should kill -CONT, wait, kill -STOP
again, and repeat ad nauseam. If there aren't any children, kill
-TERM and then kill -CONT.
22. Replace sendmail with a link to qmail's ``sendmail'' wrapper:
# mv /usr/lib/sendmail /usr/lib/sendmail.bak
# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail # ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
/usr/sbin might not exist on your system.
23. Set up qmail-smtpd in /etc/inetd.conf (all on one line): 16. Set up qmail-smtpd in /etc/inetd.conf (all on one line):
smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env
tcp-env /var/qmail/bin/qmail-smtpd tcp-env /var/qmail/bin/qmail-smtpd
Also comment out comsat in /etc/inetd.conf.
24. Reboot. (Or kill -HUP your inetd and make sure the qmail daemons 17. Reboot. (Or kill -HUP your inetd and make sure the qmail daemons
are running.) are running.)
25. Try to flush the sendmail queue: 18. Read TEST.receive.
# /usr/lib/sendmail.bak -q
You can safely run sendmail.bak -q (or even sendmail.bak -q15m)
while qmail is running. Do this until the sendmail queue is empty.
This may take several days.
26. Disable all the sendmail and binmail programs in your system. The
safest approach is to chmod 0 everything. Some locations to check:
/usr/sbin/sendmail, /usr/lib/sendmail.bak, /usr/lib/sendmail.mx,
/bin/mail, /usr/libexec/mail.local.
27. Make sure that ``mail'' still invokes a reasonable mailer. Under
SVR4 you may want to link mail to mailx.
Post-upgrade tests (can be done immediately after step 24):
28. SMTP server test: Forge some mail locally via SMTP.
% telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 domain ESMTP
helo dude
250-domain
250-PIPELINING
250 8BITMIME
mail <me@domain>
250 ok
rcpt <me@domain>
250 ok
data
354 go ahead
Subject: testing
This is a test.
.
250 ok 812345679 qp 12345
quit
221 domain
Connection closed by foreign host.
%
Look for the message in your mailbox.
29. Remote-local test: Send yourself some mail from another machine.
30. Remote-error test: I think you can figure this one out.
31. UA test: Try sending mail, first to a local account, then to a
remote account, with your normal user agent.
32. Remote-postmaster test: Send mail from another machine to
PoStMaStEr@domain. Look for the message in the alias mailbox.
That's it! To report success: That's it! To report success:
% ( echo 'First M. Last'; cat `cat SYSDEPS` ) \ % ( echo 'First M. Last'; cat `cat SYSDEPS` ) | mail djb-qst@cr.yp.to
| mail djb-qst@cr.yp.to Replace First M. Last with your name.
Replace First M. Last with your name. If you have questions about qmail,
join the qmail mailing list; see http://pobox.com/~djb/qmail.html. If you have questions about qmail, join the qmail mailing list; see
http://pobox.com/~djb/qmail.html.

View file

@ -1,15 +0,0 @@
The qmail daemons have to be restarted whenever your system reboots.
Meanwhile, sendmail doesn't have to be started any more. Here's what you
should do.
Find sendmail in your boot scripts. It's usually in either /etc/rc or
/etc/init.d/sendmail. It looks like
sendmail -bd -q15m
-q15m means it should run the queue every 15 minutes; you may see a
different number. Comment out this line, and replace it with
csh -cf '/var/qmail/rc &'
That's it. (Make sure you include the &.)

View file

@ -25,11 +25,6 @@ default. Nevertheless, I encourage you to start asking for maildir
versions of your favorite MUAs, and to switch over to maildir as soon as versions of your favorite MUAs, and to switch over to maildir as soon as
you can. you can.
WARNING: qmail uses flock() to lock ~user/Mailbox. This agrees with the
modern mail.local locking choice. If your MUA doesn't use flock(), your
best bet is to switch to maildir, and to set up synchronous maildir2mbox
execution, as described below.
2. Sun's Network F_ail_u_re System 2. Sun's Network F_ail_u_re System

View file

@ -2,16 +2,17 @@ The qmail package includes a local delivery agent, qmail-local, which
provides user-controlled mailing lists, cross-host alias loop detection, provides user-controlled mailing lists, cross-host alias loop detection,
and many other important qmail features. and many other important qmail features.
There's one part of qmail-local that you need to know about right now: There's one important difference between qmail-local and binmail:
qmail-local delivers mail by default into ~user/Mailbox (in mbox format, qmail-local delivers mail by default into ~user/Mailbox, rather than
using flock), rather than /var/spool/mail/user. /var/spool/mail/user. It uses mbox format, with lockf locking on systems
that don't have flock (HP/UX, Solaris), and flock locking otherwise.
For an explanation of the problems with /var/spool/mail, and a list of This file explains how to switch your system to ~user/Mailbox. You
options if you want to continue delivering to /var/spool/mail, see aren't required to do this; for further discussion of /var/spool/mail,
INSTALL.vsm. and an explanation of how to continue using binmail for local
deliveries, see INSTALL.vsm.
This file explains how to handle the change to ~user/Mailbox. The basic The basic procedure for switching to ~user/Mailbox is simple:
procedure is simple:
* Move each /var/spool/mail/user to ~user/Mailbox. For safety, do * Move each /var/spool/mail/user to ~user/Mailbox. For safety, do
this in single-user mode. this in single-user mode.
@ -20,11 +21,17 @@ procedure is simple:
~user/Mailbox for each user. /var/spool/mail should be mode 1777, ~user/Mailbox for each user. /var/spool/mail should be mode 1777,
so users will not be able to accidentally remove these links. so users will not be able to accidentally remove these links.
A few mail programs are unable to handle symbolic links, so you will
have to configure them to look at ~user/Mailbox directly:
* procmail: Change SYSTEM_MBOX in config.h and recompile; or, with
recent versions, define MAILSPOOLHOME in src/authenticate.c.
An alternative to symbolic links is hlfsd. Consult the documentation for An alternative to symbolic links is hlfsd. Consult the documentation for
hlfsd if it is included in your operating system. hlfsd if it is included in your operating system.
If /var/spool/mail is large, you can gain extra speed by configuring If /var/spool/mail is large, you can gain extra speed by configuring
your mail software to look at ~user/Mailbox directly: all your mail software to look at ~user/Mailbox directly:
* Most MUAs: Put ``setenv MAIL $HOME/Mailbox'' in your system-wide * Most MUAs: Put ``setenv MAIL $HOME/Mailbox'' in your system-wide
.cshrc and ``MAIL=$HOME/Mailbox; export MAIL'' in your system-wide .cshrc and ``MAIL=$HOME/Mailbox; export MAIL'' in your system-wide
@ -37,8 +44,6 @@ your mail software to look at ~user/Mailbox directly:
* pine: Put ``inbox-path=Mailbox'' in your system-wide pine.conf. * pine: Put ``inbox-path=Mailbox'' in your system-wide pine.conf.
(For pine versions more recent than 3.91, see also FAQ 6.2.) (For pine versions more recent than 3.91, see also FAQ 6.2.)
* procmail: Change SYSTEM_MBOX in config.h and recompile.
* qpopper 2.2: Change /.mail to /Mailbox in pop_dropcopy.c and * qpopper 2.2: Change /.mail to /Mailbox in pop_dropcopy.c and
recompile with -DHOMEDIRMAIL in CFLAGS. recompile with -DHOMEDIRMAIL in CFLAGS.

196
Makefile
View file

@ -178,6 +178,19 @@ binm3+df.sh conf-qmail
> binm3+df > binm3+df
chmod 755 binm3+df chmod 755 binm3+df
bouncesaying: \
load bouncesaying.o strerr.a error.a substdio.a str.a wait.a
./load bouncesaying strerr.a error.a substdio.a str.a \
wait.a
bouncesaying.0: \
bouncesaying.1
nroff -man bouncesaying.1 > bouncesaying.0
bouncesaying.o: \
compile bouncesaying.c fork.h strerr.h error.h wait.h sig.h exit.h
./compile bouncesaying.c
byte_chr.o: \ byte_chr.o: \
compile byte_chr.c byte.h compile byte_chr.c byte.h
./compile byte_chr.c ./compile byte_chr.c
@ -267,8 +280,8 @@ uint32.h substdio.h
./compile cdbmss.c ./compile cdbmss.c
check: \ check: \
it man conf-qmail it man
./qmail-hier | ./instcheck `head -1 conf-qmail` ./instcheck
chkshsgr: \ chkshsgr: \
load chkshsgr.o load chkshsgr.o
@ -511,6 +524,18 @@ error_temp.o: \
compile error_temp.c error.h compile error_temp.c error.h
./compile error_temp.c ./compile error_temp.c
except: \
load except.o strerr.a error.a substdio.a str.a wait.a
./load except strerr.a error.a substdio.a str.a wait.a
except.0: \
except.1
nroff -man except.1 > except.0
except.o: \
compile except.c fork.h strerr.h wait.h error.h exit.h
./compile except.c
fd.a: \ fd.a: \
makelib fd_copy.o fd_move.o makelib fd_copy.o fd_move.o
./makelib fd.a fd_copy.o fd_move.o ./makelib fd.a fd_copy.o fd_move.o
@ -676,6 +701,10 @@ hfield.o: \
compile hfield.c hfield.h compile hfield.c hfield.h
./compile hfield.c ./compile hfield.c
hier.o: \
compile hier.c auto_qmail.h auto_split.h auto_uids.h fmt.h fifo.h
./compile hier.c
home: \ home: \
home.sh conf-qmail home.sh conf-qmail
cat home.sh \ cat home.sh \
@ -699,26 +728,48 @@ hostname.o: \
compile hostname.c substdio.h subfd.h substdio.h readwrite.h exit.h compile hostname.c substdio.h subfd.h substdio.h readwrite.h exit.h
./compile hostname.c ./compile hostname.c
idedit: \
load idedit.o strerr.a substdio.a error.a str.a fs.a wait.a open.a \
seek.a
./load idedit strerr.a substdio.a error.a str.a fs.a \
wait.a open.a seek.a
idedit.o: \
compile idedit.c readwrite.h exit.h scan.h fmt.h strerr.h open.h \
seek.h fork.h
./compile idedit.c
install: \ install: \
load install.o fifo.o getln.a strerr.a substdio.a stralloc.a alloc.a \ load install.o fifo.o hier.o auto_qmail.o auto_split.o auto_uids.o \
open.a error.a str.a fs.a strerr.a substdio.a open.a error.a str.a fs.a
./load install fifo.o getln.a strerr.a substdio.a \ ./load install fifo.o hier.o auto_qmail.o auto_split.o \
stralloc.a alloc.a open.a error.a str.a fs.a auto_uids.o strerr.a substdio.a open.a error.a str.a fs.a
install-big: \
load install-big.o fifo.o install.o auto_qmail.o auto_split.o \
auto_uids.o strerr.a substdio.a open.a error.a str.a fs.a
./load install-big fifo.o install.o auto_qmail.o \
auto_split.o auto_uids.o strerr.a substdio.a open.a error.a \
str.a fs.a
install-big.o: \
compile install-big.c auto_qmail.h auto_split.h auto_uids.h fmt.h \
fifo.h
./compile install-big.c
install.o: \ install.o: \
compile install.c substdio.h stralloc.h gen_alloc.h getln.h \ compile install.c substdio.h strerr.h error.h open.h readwrite.h \
readwrite.h exit.h open.h error.h strerr.h byte.h fifo.h exit.h
./compile install.c ./compile install.c
instcheck: \ instcheck: \
load instcheck.o getln.a strerr.a substdio.a stralloc.a alloc.a \ load instcheck.o fifo.o hier.o auto_qmail.o auto_split.o auto_uids.o \
error.a str.a fs.a strerr.a substdio.a error.a str.a fs.a
./load instcheck getln.a strerr.a substdio.a stralloc.a \ ./load instcheck fifo.o hier.o auto_qmail.o auto_split.o \
alloc.a error.a str.a fs.a auto_uids.o strerr.a substdio.a error.a str.a fs.a
instcheck.o: \ instcheck.o: \
compile instcheck.c substdio.h stralloc.h gen_alloc.h getln.h \ compile instcheck.c strerr.h error.h readwrite.h exit.h
readwrite.h exit.h error.h strerr.h byte.h
./compile instcheck.c ./compile instcheck.c
ip.o: \ ip.o: \
@ -754,9 +805,10 @@ qmail-pw2u qmail-qread qmail-qstat qmail-tcpto qmail-tcpok \
qmail-pop3d qmail-popup qmail-qmqpc qmail-qmqpd qmail-qmtpd \ qmail-pop3d qmail-popup qmail-qmqpc qmail-qmqpd qmail-qmtpd \
qmail-smtpd sendmail tcp-env qmail-newmrh config config-fast dnscname \ qmail-smtpd sendmail tcp-env qmail-newmrh config config-fast dnscname \
dnsptr dnsip dnsmxip dnsfq hostname ipmeprint qreceipt qsmhook qbiff \ dnsptr dnsip dnsmxip dnsfq hostname ipmeprint qreceipt qsmhook qbiff \
forward preline condredirect maildirmake maildir2mbox maildirwatch \ forward preline condredirect bouncesaying except maildirmake \
qail elq pinq qmail-hier install instcheck home home+df proc proc+df \ maildir2mbox maildirwatch qail elq pinq idedit install-big install \
binm1 binm1+df binm2 binm2+df binm3 binm3+df instcheck home home+df proc proc+df binm1 binm1+df binm2 binm2+df \
binm3 binm3+df
load: \ load: \
make-load warn-auto.sh systype make-load warn-auto.sh systype
@ -879,10 +931,11 @@ qmail-queue.0 qmail-inject.0 mailsubj.0 qmail-showctl.0 qmail-newu.0 \
qmail-pw2u.0 qmail-qread.0 qmail-qstat.0 qmail-tcpto.0 qmail-tcpok.0 \ qmail-pw2u.0 qmail-qread.0 qmail-qstat.0 qmail-tcpto.0 qmail-tcpok.0 \
qmail-pop3d.0 qmail-popup.0 qmail-qmqpc.0 qmail-qmqpd.0 qmail-qmtpd.0 \ qmail-pop3d.0 qmail-popup.0 qmail-qmqpc.0 qmail-qmqpd.0 qmail-qmtpd.0 \
qmail-smtpd.0 tcp-env.0 qmail-newmrh.0 qreceipt.0 qbiff.0 forward.0 \ qmail-smtpd.0 tcp-env.0 qmail-newmrh.0 qreceipt.0 qbiff.0 forward.0 \
preline.0 condredirect.0 maildirmake.0 maildir2mbox.0 maildirwatch.0 \ preline.0 condredirect.0 bouncesaying.0 except.0 maildirmake.0 \
qmail.0 qmail-limits.0 qmail-log.0 qmail-control.0 qmail-header.0 \ maildir2mbox.0 maildirwatch.0 qmail.0 qmail-limits.0 qmail-log.0 \
qmail-users.0 dot-qmail.0 qmail-command.0 tcp-environ.0 maildir.0 \ qmail-control.0 qmail-header.0 qmail-users.0 dot-qmail.0 \
mbox.0 addresses.0 envelopes.0 forgeries.0 qmail-command.0 tcp-environ.0 maildir.0 mbox.0 addresses.0 \
envelopes.0 forgeries.0
mbox.0: \ mbox.0: \
mbox.5 mbox.5
@ -1082,17 +1135,6 @@ qmail-header.0: \
qmail-header.5 qmail-header.5
nroff -man qmail-header.5 > qmail-header.0 nroff -man qmail-header.5 > qmail-header.0
qmail-hier: \
load qmail-hier.o substdio.a error.a str.a fs.a auto_split.o \
auto_uids.o
./load qmail-hier substdio.a error.a str.a fs.a \
auto_split.o auto_uids.o
qmail-hier.o: \
compile qmail-hier.c subfd.h substdio.h substdio.h auto_split.h \
auto_uids.h fmt.h
./compile qmail-hier.c
qmail-inject: \ qmail-inject: \
load qmail-inject.o headerbody.o hfield.o newfield.o quote.o now.o \ load qmail-inject.o headerbody.o hfield.o newfield.o quote.o now.o \
control.o date822fmt.o constmap.o qmail.o case.a fd.a wait.a open.a \ control.o date822fmt.o constmap.o qmail.o case.a fd.a wait.a open.a \
@ -1470,11 +1512,13 @@ fmtqfn.h readsubdir.h direntry.h
./compile qmail-send.c ./compile qmail-send.c
qmail-showctl: \ qmail-showctl: \
load qmail-showctl.o control.o open.a getln.a stralloc.a alloc.a \ load qmail-showctl.o auto_uids.o control.o open.a getln.a stralloc.a \
substdio.a error.a str.a fs.a auto_qmail.o auto_uids.o alloc.a substdio.a error.a str.a fs.a auto_qmail.o auto_break.o \
./load qmail-showctl control.o open.a getln.a stralloc.a \ auto_patrn.o auto_spawn.o auto_split.o
alloc.a substdio.a error.a str.a fs.a auto_qmail.o \ ./load qmail-showctl auto_uids.o control.o open.a getln.a \
auto_uids.o stralloc.a alloc.a substdio.a error.a str.a fs.a \
auto_qmail.o auto_break.o auto_patrn.o auto_spawn.o \
auto_split.o
qmail-showctl.0: \ qmail-showctl.0: \
qmail-showctl.8 qmail-showctl.8
@ -1483,7 +1527,8 @@ qmail-showctl.8
qmail-showctl.o: \ qmail-showctl.o: \
compile qmail-showctl.c substdio.h subfd.h substdio.h exit.h fmt.h \ compile qmail-showctl.c substdio.h subfd.h substdio.h exit.h fmt.h \
str.h control.h constmap.h stralloc.h gen_alloc.h direntry.h \ str.h control.h constmap.h stralloc.h gen_alloc.h direntry.h \
auto_qmail.h auto_uids.h auto_uids.h auto_qmail.h auto_break.h auto_patrn.h auto_spawn.h \
auto_split.h
./compile qmail-showctl.c ./compile qmail-showctl.c
qmail-smtpd: \ qmail-smtpd: \
@ -1698,8 +1743,8 @@ substdio.h alloc.h auto_qmail.h exit.h env.h str.h
./compile sendmail.c ./compile sendmail.c
setup: \ setup: \
it man conf-qmail it man
./qmail-hier | ./install `head -1 conf-qmail` ./install
sgetopt.o: \ sgetopt.o: \
compile sgetopt.c substdio.h subfd.h substdio.h sgetopt.h subgetopt.h \ compile sgetopt.c substdio.h subfd.h substdio.h sgetopt.h subgetopt.h \
@ -1708,25 +1753,27 @@ subgetopt.h
shar: \ shar: \
FILES BLURB BLURB2 BLURB3 BLURB4 README FAQ INSTALL INSTALL.alias \ FILES BLURB BLURB2 BLURB3 BLURB4 README FAQ INSTALL INSTALL.alias \
INSTALL.boot INSTALL.ctl INSTALL.ids INSTALL.maildir INSTALL.mbox \ INSTALL.ctl INSTALL.ids INSTALL.maildir INSTALL.mbox INSTALL.vsm \
INSTALL.vsm UPGRADE THOUGHTS TODO THANKS CHANGES SECURITY INTERNALS \ REMOVE.sendmail REMOVE.binmail TEST.deliver TEST.receive UPGRADE \
SENDMAIL PIC.local2alias PIC.local2ext PIC.local2local PIC.local2rem \ THOUGHTS TODO THANKS CHANGES SECURITY INTERNALS SENDMAIL \
PIC.local2alias PIC.local2ext PIC.local2local PIC.local2rem \
PIC.local2virt PIC.nullclient PIC.relaybad PIC.relaygood \ PIC.local2virt PIC.nullclient PIC.relaybad PIC.relaygood \
PIC.rem2local FILES VERSION SYSDEPS TARGETS Makefile conf-break \ PIC.rem2local FILES VERSION SYSDEPS TARGETS Makefile BIN.README \
auto_break.h conf-spawn auto_spawn.h chkspawn.c conf-split \ BIN.Makefile BIN.setup idedit.c conf-break auto_break.h conf-spawn \
auto_split.h conf-patrn auto_patrn.h conf-users conf-groups \ auto_spawn.h chkspawn.c conf-split auto_split.h conf-patrn \
auto_uids.h auto_usera.h extra.h addresses.5 condredirect.1 \ auto_patrn.h conf-users conf-groups auto_uids.h auto_usera.h extra.h \
dot-qmail.9 envelopes.5 forgeries.7 forward.1 maildir2mbox.1 \ addresses.5 except.1 bouncesaying.1 condredirect.1 dot-qmail.9 \
maildirmake.1 maildirwatch.1 mailsubj.1 mbox.5 preline.1 qbiff.1 \ envelopes.5 forgeries.7 forward.1 maildir2mbox.1 maildirmake.1 \
qmail-clean.8 qmail-command.8 qmail-control.9 qmail-getpw.9 \ maildirwatch.1 mailsubj.1 mbox.5 preline.1 qbiff.1 qmail-clean.8 \
qmail-header.5 qmail-inject.8 qmail-limits.9 qmail-local.8 \ qmail-command.8 qmail-control.9 qmail-getpw.9 qmail-header.5 \
qmail-log.5 qmail-lspawn.8 qmail-newmrh.9 qmail-newu.9 qmail-pop3d.8 \ qmail-inject.8 qmail-limits.9 qmail-local.8 qmail-log.5 \
qmail-lspawn.8 qmail-newmrh.9 qmail-newu.9 qmail-pop3d.8 \
qmail-popup.8 qmail-pw2u.9 qmail-qmqpc.8 qmail-qmqpd.8 qmail-qmtpd.8 \ qmail-popup.8 qmail-pw2u.9 qmail-qmqpc.8 qmail-qmqpd.8 qmail-qmtpd.8 \
qmail-qread.8 qmail-qstat.8 qmail-queue.8 qmail-remote.8 \ qmail-qread.8 qmail-qstat.8 qmail-queue.8 qmail-remote.8 \
qmail-rspawn.8 qmail-send.9 qmail-showctl.8 qmail-smtpd.8 \ qmail-rspawn.8 qmail-send.9 qmail-showctl.8 qmail-smtpd.8 \
qmail-start.9 qmail-tcpok.8 qmail-tcpto.8 qmail-users.9 qmail.7 \ qmail-start.9 qmail-tcpok.8 qmail-tcpto.8 qmail-users.9 qmail.7 \
qreceipt.1 splogger.8 tcp-env.1 config.sh config-fast.sh \ qreceipt.1 splogger.8 tcp-env.1 config.sh config-fast.sh \
qmail-clean.c qmail-getpw.c qmail-hier.c qmail-inject.c qmail-local.c \ qmail-clean.c qmail-getpw.c qmail-inject.c qmail-local.c \
qmail-lspawn.c qmail-newmrh.c qmail-newu.c qmail-pop3d.c \ qmail-lspawn.c qmail-newmrh.c qmail-newu.c qmail-pop3d.c \
qmail-popup.c qmail-pw2u.c qmail-qmqpc.c qmail-qmqpd.c qmail-qmtpd.c \ qmail-popup.c qmail-pw2u.c qmail-qmqpc.c qmail-qmqpd.c qmail-qmtpd.c \
qmail-qread.c qmail-qstat.sh qmail-queue.c qmail-remote.c \ qmail-qread.c qmail-qstat.sh qmail-queue.c qmail-remote.c \
@ -1734,27 +1781,28 @@ qmail-rspawn.c qmail-send.c qmail-showctl.c qmail-smtpd.c \
qmail-start.c qmail-tcpok.c qmail-tcpto.c spawn.c dnscname.c dnsfq.c \ qmail-start.c qmail-tcpok.c qmail-tcpto.c spawn.c dnscname.c dnsfq.c \
dnsip.c dnsmxip.c dnsptr.c hostname.c ipmeprint.c tcp-env.c \ dnsip.c dnsmxip.c dnsptr.c hostname.c ipmeprint.c tcp-env.c \
sendmail.c qreceipt.c qsmhook.c qbiff.c forward.c preline.c predate.c \ sendmail.c qreceipt.c qsmhook.c qbiff.c forward.c preline.c predate.c \
condredirect.c maildirmake.c maildir2mbox.c maildirwatch.c splogger.c \ except.c bouncesaying.c condredirect.c maildirmake.c maildir2mbox.c \
qail.sh elq.sh pinq.sh qmail-upq.sh datemail.sh mailsubj.sh qlx.h \ maildirwatch.c splogger.c qail.sh elq.sh pinq.sh qmail-upq.sh \
rcpthosts.h rcpthosts.c commands.h commands.c dnsdoe.h dnsdoe.c \ datemail.sh mailsubj.sh qlx.h rcpthosts.h rcpthosts.c commands.h \
fmtqfn.h fmtqfn.c gfrom.h gfrom.c myctime.h myctime.c newfield.h \ commands.c dnsdoe.h dnsdoe.c fmtqfn.h fmtqfn.c gfrom.h gfrom.c \
newfield.c qsutil.h qsutil.c readsubdir.h readsubdir.c received.h \ myctime.h myctime.c newfield.h newfield.c qsutil.h qsutil.c \
received.c tcpto.h tcpto.c tcpto_clean.c trigger.h trigger.c \ readsubdir.h readsubdir.c received.h received.c tcpto.h tcpto.c \
triggerpull.h triggerpull.c trynpbg1.c trysyslog.c conf-cc conf-ld \ tcpto_clean.c trigger.h trigger.c triggerpull.h triggerpull.c \
home.sh home+df.sh proc.sh proc+df.sh binm1.sh binm2.sh binm3.sh \ trynpbg1.c trysyslog.c conf-cc conf-ld home.sh home+df.sh proc.sh \
binm1+df.sh binm2+df.sh binm3+df.sh find-systype.sh make-compile.sh \ proc+df.sh binm1.sh binm2.sh binm3.sh binm1+df.sh binm2+df.sh \
make-load.sh make-makelib.sh trycpp.c warn-auto.sh auto-str.c \ binm3+df.sh find-systype.sh make-compile.sh make-load.sh \
auto-int.c auto-int8.c auto-gid.c auto-uid.c install.c instcheck.c \ make-makelib.sh trycpp.c warn-auto.sh auto-str.c auto-int.c \
alloc.3 alloc.h alloc.c alloc_re.c case.3 case.h case_diffb.c \ auto-int8.c auto-gid.c auto-uid.c hier.c install.c instcheck.c \
case_diffs.c case_lowerb.c case_lowers.c case_starts.c cdb.3 cdb.h \ install-big.c alloc.3 alloc.h alloc.c alloc_re.c case.3 case.h \
cdb_hash.c cdb_seek.c cdb_unpack.c cdbmake.h cdbmake_add.c \ case_diffb.c case_diffs.c case_lowerb.c case_lowers.c case_starts.c \
cdbmake_hash.c cdbmake_pack.c cdbmss.h cdbmss.c coe.3 coe.h coe.c \ cdb.3 cdb.h cdb_hash.c cdb_seek.c cdb_unpack.c cdbmake.h \
fd.h fd_copy.3 fd_copy.c fd_move.3 fd_move.c fifo_make.3 fifo.h \ cdbmake_add.c cdbmake_hash.c cdbmake_pack.c cdbmss.h cdbmss.c coe.3 \
fifo.c trymkffo.c fork.h1 fork.h2 tryvfork.c now.3 now.h now.c open.h \ coe.h coe.c fd.h fd_copy.3 fd_copy.c fd_move.3 fd_move.c fifo_make.3 \
open_append.c open_excl.c open_read.c open_trunc.c open_write.c \ fifo.h fifo.c trymkffo.c fork.h1 fork.h2 tryvfork.c now.3 now.h now.c \
seek.h seek_cur.c seek_end.c seek_set.c seek_trunc.c conf-qmail \ open.h open_append.c open_excl.c open_read.c open_trunc.c \
auto_qmail.h qmail.h qmail.c gen_alloc.h gen_allocdefs.h stralloc.3 \ open_write.c seek.h seek_cur.c seek_end.c seek_set.c seek_trunc.c \
stralloc.h stralloc_eady.c stralloc_pend.c stralloc_copy.c \ conf-qmail auto_qmail.h qmail.h qmail.c gen_alloc.h gen_allocdefs.h \
stralloc.3 stralloc.h stralloc_eady.c stralloc_pend.c stralloc_copy.c \
stralloc_opyb.c stralloc_opys.c stralloc_cat.c stralloc_catb.c \ stralloc_opyb.c stralloc_opys.c stralloc_cat.c stralloc_catb.c \
stralloc_cats.c stralloc_arts.c strerr.h strerr_sys.c strerr_die.c \ stralloc_cats.c stralloc_arts.c strerr.h strerr_sys.c strerr_die.c \
substdio.h substdio.c substdi.c substdo.c substdio_copy.c subfd.h \ substdio.h substdio.c substdi.c substdo.c substdio_copy.c subfd.h \

8
README
View file

@ -1,5 +1,5 @@
qmail 1.02 qmail 1.03
19980430 19980615
Copyright 1998 Copyright 1998
D. J. Bernstein, qmail@pobox.com D. J. Bernstein, qmail@pobox.com
@ -8,8 +8,8 @@ It is meant as a replacement for the entire sendmail-binmail system on
typical Internet-connected UNIX hosts. See BLURB, BLURB2, BLURB3, and typical Internet-connected UNIX hosts. See BLURB, BLURB2, BLURB3, and
BLURB4 for more detailed advertisements. BLURB4 for more detailed advertisements.
INSTALL says how to set up and test qmail. If you're upgrading from INSTALL says how to set up and test qmail. If you're upgrading from a
1.01, read UPGRADE instead. previous version, read UPGRADE instead.
See PIC.* for some ``end-to-end'' pictures of mail flowing through the See PIC.* for some ``end-to-end'' pictures of mail flowing through the
qmail system. qmail system.

16
REMOVE.binmail Normal file
View file

@ -0,0 +1,16 @@
Here's how to remove binmail from your system. Don't do this if you have
configured qmail to use binmail for local delivery.
1. Find the binmail binary on your system: /usr/libexec/mail.local if
that exists, otherwise /bin/mail.
2. Remove permissions from the binmail binary:
# chmod 0 /usr/libexec/mail.local
3. If the binmail binary was /bin/mail, make sure that ``mail'' still
invokes a usable mailer. Under SVR4 you may want to link mail to
mailx.
4. Comment out the comsat line in /etc/inetd.conf, and kill -HUP your
inetd.

28
REMOVE.sendmail Normal file
View file

@ -0,0 +1,28 @@
Here's how to remove sendmail from your system.
1. Find sendmail in your boot scripts. It's usually in either /etc/rc or
/etc/init.d/sendmail. It looks like
sendmail -bd -q15m
-q15m means that it should run the queue every 15 minutes; you may
see a different number. Comment out this line.
2. Kill the sendmail daemon. You should first kill -STOP the daemon; if
any children are running, you should kill -CONT, wait, kill -STOP
again, and repeat ad nauseam. If there aren't any children, kill
-TERM and then kill -CONT.
3. Check whether you have any messages in the sendmail queue,
/var/spool/mqueue. If you do, you will have to try flushing them with
sendmail.bak -q. If necessary, wait a while and run sendmail.bak -q
again. Repeat until the queue is empty. This may take several days.
4. Remove the setuid bit on the sendmail binary, to prevent local users
from gaining extra privileges through sendmail's security holes. The
binary may be at several different locations:
# chmod 0 /usr/lib/sendmail
# chmod 0 /usr/sbin/sendmail
# chmod 0 /usr/lib/sendmail.mx
5. Move the sendmail binary out of the way:
# mv /usr/lib/sendmail /usr/lib/sendmail.bak
# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak

13
TARGETS
View file

@ -288,6 +288,10 @@ preline.o
preline preline
condredirect.o condredirect.o
condredirect condredirect
bouncesaying.o
bouncesaying
except.o
except
maildirmake.o maildirmake.o
maildirmake maildirmake
maildir2mbox.o maildir2mbox.o
@ -297,9 +301,12 @@ maildirwatch
qail qail
elq elq
pinq pinq
qmail-hier.o idedit.o
qmail-hier idedit
install-big.o
install.o install.o
install-big
hier.o
install install
instcheck.o instcheck.o
instcheck instcheck
@ -352,6 +359,8 @@ qbiff.0
forward.0 forward.0
preline.0 preline.0
condredirect.0 condredirect.0
bouncesaying.0
except.0
maildirmake.0 maildirmake.0
maildir2mbox.0 maildir2mbox.0
maildirwatch.0 maildirwatch.0

82
TEST.deliver Normal file
View file

@ -0,0 +1,82 @@
You can do several tests of qmail delivery without setting up qmail to
accept messages through SMTP or through /usr/lib/sendmail:
1. After you start qmail, look for a
qmail: status: local 0/10 remote 0/20
line in syslog. qmail-send always prints either ``cannot start'' or
``status''. (The big number is a splogger timestamp.)
2. Do a ps and look for the qmail daemons. There should be four of
them, all idle: qmail-send, running as qmails; qmail-lspawn, running
as root; qmail-rspawn, running as qmailr; and qmail-clean, running
as qmailq. You will also see splogger, running as qmaill.
3. Local-local test: Send yourself an empty message. (Replace ``me''
with your username. Make sure to include the ``to:'' colon.)
% echo to: me | /var/qmail/bin/qmail-inject
The message will show up immediately in your mailbox, and syslog
will show something like this:
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20345 uid 666
qmail: starting delivery 1: msg 53 to local me@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 1: success: did_1+0+0/
qmail: status: local 0/10 remote 0/20
qmail: end msg 53
(53 is an inode number; 20345 is a process ID; your numbers will
probably be different.)
4. Local-error test: Send a message to a nonexistent local address.
% echo to: nonexistent | /var/qmail/bin/qmail-inject
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20351 uid 666
qmail: starting delivery 2: msg 53 to local nonexistent@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 2: failure: No_such_address.__#5.1.1_/
qmail: status: local 0/10 remote 0/20
qmail: bounce msg 53 qp 20357
qmail: end msg 53
qmail: new msg 54
qmail: info msg 54: bytes 743 from <> qp 20357 uid 666
qmail: starting delivery 3: msg 54 to local me@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 3: success: did_1+0+0/
qmail: status: local 0/10 remote 0/20
qmail: end msg 54
You will now have a bounce message in your mailbox.
5. Local-remote test: Send an empty message to your account on another
machine.
% echo to: me@wherever | /var/qmail/bin/qmail-inject
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20372 uid 666
qmail: starting delivery 4: msg 53 to remote me@wherever
qmail: status: local 0/10 remote 1/20
qmail: delivery 4: success: 1.2.3.4_accepted_message./...
qmail: status: local 0/10 remote 0/20
qmail: end msg 53
There will be a pause between ``starting delivery'' and ``success'';
SMTP is slow. Check that the message is in your mailbox on the other
machine.
6. Local-postmaster test: Send mail to postmaster, any capitalization.
% echo to: POSTmaster | /var/qmail/bin/qmail-inject
Look for the message in the alias mailbox, normally ~alias/Mailbox.
7. Double-bounce test: Send a message with a completely bad envelope.
% /var/qmail/bin/qmail-inject -f nonexistent
To: unknownuser
Subject: testing
This is a test. This is only a test.
%
(Use end-of-file, not dot, to end the message.) Look for the double
bounce in the alias mailbox.
8. Group membership test:
% cat > ~me/.qmail-groups
|groups >> MYGROUPS; exit 0
% /var/qmail/bin/qmail-inject me-groups < /dev/null
% cat ~me/MYGROUPS
MYGROUPS will show your normal gid and nothing else. (Under Solaris,
make sure to use /usr/ucb/groups; /usr/bin/groups is broken.)

41
TEST.receive Normal file
View file

@ -0,0 +1,41 @@
You can do several tests of messages entering the qmail system:
1. SMTP server test: Forge some mail locally via SMTP. Replace ``me''
with your username and ``domain'' with your host's name.
% telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 domain ESMTP
helo dude
250 domain
mail <me@domain>
250 ok
rcpt <me@domain>
250 ok
data
354 go ahead
Subject: testing
This is a test.
.
250 ok 812345679 qp 12345
quit
221 domain
Connection closed by foreign host.
%
Look for the message in your mailbox. (Note for programmers: Most
SMTP servers need more text after MAIL and RCPT. See RFC 821.)
2. Remote-local test: Send yourself some mail from another machine.
Look for the message in your mailbox.
3. Remote-error test: Send some mail from another machine to
nonexistent@domain. Look for a bounce message in the remote mailbox.
4. UA test: Try sending mail, first to a local account, then to a
remote account, with your normal user agent.
5. Remote-postmaster test: Send mail from another machine to
PoStMaStEr@domain. Look for the message in the alias mailbox,
normally ~alias/Mailbox.

2
THANKS
View file

@ -168,6 +168,7 @@ JPB = Joe Block
JPH = Justin P. Hannah JPH = Justin P. Hannah
JPR = Jean-Pierre Radley JPR = Jean-Pierre Radley
JRL = John R. Levine JRL = John R. Levine
JRM = Jason R. Mastaler
JRY = Jamie R. Yukes JRY = Jamie R. Yukes
JS = Jesper Skriver JS = Jesper Skriver
JTB = Jonathan T. Bowie JTB = Jonathan T. Bowie
@ -231,6 +232,7 @@ MWE = Mark W. Eichin
NA = Norm Aleks NA = Norm Aleks
NAA = Nicholas A. Amato NAA = Nicholas A. Amato
NH = Nick Holloway NH = Nick Holloway
NND = N. Dudorov
NR = Norbert Roeding NR = Norbert Roeding
NW = Nicholas Waples NW = Nicholas Waples
OK = Oezguer Kesim OK = Oezguer Kesim

11
TODO
View file

@ -1,6 +1,3 @@
test qmail-qmqpc
test qmail-qmqpd
consider stripping vdoms for VERPs; tnx PJH consider stripping vdoms for VERPs; tnx PJH
consider ~ in qmail-local for doing defaultdelivery (not recursively) consider ~ in qmail-local for doing defaultdelivery (not recursively)
consider POP bulletins consider POP bulletins
@ -16,10 +13,10 @@ test for linux fifo close bug at compile time
eliminate qsmhook eliminate qsmhook
finish OTBS conversion finish OTBS conversion
use lib822 in qmail-inject use mess822 in qmail-inject
use lib822 in qreceipt use mess822 in qreceipt
use lib822 in qbiff use mess822 in qbiff
use lib822 in maildirwatch use mess822 in maildirwatch
eliminate token822, headerbody, hfield eliminate token822, headerbody, hfield
replace INTERNALS and THOUGHTS with a real paper describing qmail replace INTERNALS and THOUGHTS with a real paper describing qmail
handle IPv6 handle IPv6

166
UPGRADE
View file

@ -3,24 +3,21 @@ information generally), the qmail system comes with NO WARRANTY. It's
much more secure and reliable than sendmail, but that's not saying much. much more secure and reliable than sendmail, but that's not saying much.
Here's how to upgrade from qmail 1.01 to qmail 1.02. This procedure will Here's how to upgrade to qmail 1.03. This procedure will overwrite the
overwrite the old qmail binaries. Furthermore, it may begin delivering old qmail binaries. Furthermore, it may begin delivering messages from
messages from the queue before you have had a chance to test it. the queue before you have had a chance to test it.
WARNING: qlist has been split into a separate package. You can obtain it WARNING for upgrades from 1.00 or 1.01: qlist has been split into a
from http://pobox.com/~djb/qlist.html if you have any users who need it. separate package. You can obtain it from http://pobox.com/~djb/qlist.html
if you have any users who need it.
WARNING: recipientmap is gone. The virtualdomains mechanism has been WARNING for upgrades from 1.01: recipientmap is gone. The virtualdomains
expanded to support virtual users. mechanism has been expanded to support virtual users.
WARNING: qmail-start is now normally started from /var/qmail/rc. If you
have changed your qmail-start line, you will have to change
/var/qmail/rc accordingly in step 8.
Before starting, compare conf* to your old conf*, and make any necessary Before starting, compare conf* to your old conf*, and make any necessary
changes. Do not copy your old conf*; the baseline has changed. changes. You can copy conf* from 1.02.
How to install: How to install:
@ -39,144 +36,31 @@ How to install:
Wait for current qmail-smtpd processes to die. Wait for current qmail-smtpd processes to die.
5. Install the new binaries and man pages: 5. Install the new binaries and man pages:
# make setup # make setup check
6. Run instcheck to make sure it doesn't print any warnings: 6. If your boot scripts are using qmail-start instead of /var/qmail/rc:
# make check Copy /var/qmail/boot/home to /var/qmail/rc. (Use home+df instead if
7. Copy /var/qmail/boot/home to /var/qmail/rc. (Use home+df instead if
you have installed dot-forward; use proc or proc+df if you are using you have installed dot-forward; use proc or proc+df if you are using
procmail by default for local deliveries.) procmail by default for local deliveries.) Compare /var/qmail/rc to
your qmail-start boot line, and edit /var/qmail/rc if necessary.
8. Compare /var/qmail/rc to the qmail-start boot line in your boot Replace your qmail-start boot line with
scripts. Edit /var/qmail/rc if necessary. Replace the qmail-start
boot line in your boot scripts with
csh -cf '/var/qmail/rc &' csh -cf '/var/qmail/rc &'
9. Reenable deliveries: 7. Reenable deliveries:
# csh -cf '/var/qmail/rc &' # csh -cf '/var/qmail/rc &'
10. Reenable SMTP service by restoring the smtp line in inetd.conf; kill 8. Read TEST.deliver.
9. Reenable SMTP service by restoring the smtp line in inetd.conf; kill
-HUP your inetd. (If you are using tcpserver, simply kill -CONT your -HUP your inetd. (If you are using tcpserver, simply kill -CONT your
tcpserver. If you are running a QMTP server, reenable that too.) tcpserver. If you are running a QMTP server, reenable that too.)
10. Read TEST.receive.
How to test (steps 11-17 can be done before step 10):
11. Look for a
qmail: status: local 0/10 remote 0/20
line in syslog. (The big number is a splogger timestamp.)
12. Local-local test: Send yourself an empty message. (Replace ``me''
with your username. Make sure to include the ``to:'' colon.)
% echo to: me | /var/qmail/bin/qmail-inject
The message will show up immediately in your mailbox, and syslog
will show something like this:
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20345 uid 666
qmail: starting delivery 1: msg 53 to local me@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 1: success: did_1+0+0/
qmail: status: local 0/10 remote 0/20
qmail: end msg 53
(53 is an inode number; 20345 is a process ID; your numbers will
probably be different.)
13. Local-error test: Send a message to a nonexistent local address.
% echo to: nonexistent | /var/qmail/bin/qmail-inject
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20351 uid 666
qmail: starting delivery 2: msg 53 to local nonexistent@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 2: failure: No_such_address.__#5.1.1_/
qmail: status: local 0/10 remote 0/20
qmail: bounce msg 53 qp 20357
qmail: end msg 53
qmail: new msg 54
qmail: info msg 54: bytes 743 from <> qp 20357 uid 666
qmail: starting delivery 3: msg 54 to local me@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 3: success: did_1+0+0/
qmail: status: local 0/10 remote 0/20
qmail: end msg 54
You will now have a bounce message in your mailbox.
14. Local-remote test: Send an empty message to your account on another
machine.
% echo to: me@wherever | /var/qmail/bin/qmail-inject
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20372 uid 666
qmail: starting delivery 4: msg 53 to remote me@wherever
qmail: status: local 0/10 remote 1/20
qmail: delivery 4: success: 1.2.3.4_accepted_message./...
qmail: status: local 0/10 remote 0/20
qmail: end msg 53
There will be a pause between ``starting delivery'' and ``success'';
SMTP is slow. Check that the message is in your mailbox on the other
machine.
15. Local-postmaster test: Send mail to postmaster, any capitalization.
% echo to: POSTmaster | /var/qmail/bin/qmail-inject
Look for the message in the alias mailbox.
16. Double-bounce test: Send a message with a completely bad envelope.
% /var/qmail/bin/qmail-inject -f nonexistent
To: unknownuser
Subject: testing
This is a test. This is only a test.
%
(Use end-of-file, not dot, to end the message.) Look for the double
bounce in the alias mailbox.
17. Group membership test:
% cat > ~me/.qmail-groups
|groups >> MYGROUPS; exit 0
% /var/qmail/bin/qmail-inject me-groups < /dev/null
% cat ~me/MYGROUPS
MYGROUPS will show your normal gid and nothing else. (Under Solaris,
make sure to use /usr/ucb/groups; /usr/bin/groups is broken.)
18. SMTP server test: Forge some mail locally via SMTP.
% telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 domain ESMTP
helo dude
250-domain
250-PIPELINING
250 8BITMIME
mail <me@domain>
250 ok
rcpt <me@domain>
250 ok
data
354 go ahead
Subject: testing
This is a test.
.
250 ok 812345679 qp 12345
quit
221 domain
Connection closed by foreign host.
%
Look for the message in your mailbox.
19. Remote-local test: Send yourself some mail from another machine.
20. Remote-error test: I think you can figure this one out.
21. UA test: Try sending mail, first to a local account, then to a
remote account, with your normal user agent.
22. Remote-postmaster test: Send mail from another machine to
PoStMaStEr@domain. Look for the message in the alias mailbox.
That's it! To report success: That's it! To report success:
% ( echo 'First M. Last'; cat `cat SYSDEPS` ) \ % ( echo 'First M. Last'; cat `cat SYSDEPS` ) | mail djb-qst@cr.yp.to
| mail djb-qst@cr.yp.to Replace First M. Last with your name.
Replace First M. Last with your name. If you have questions about qmail,
join the qmail mailing list; see http://pobox.com/~djb/qmail.html. If you have questions about qmail, join the qmail mailing list; see
http://pobox.com/~djb/qmail.html.

View file

@ -1 +1 @@
qmail 1.02 qmail 1.03

71
bouncesaying.1 Normal file
View file

@ -0,0 +1,71 @@
.TH bouncesaying 1
.SH NAME
bouncesaying \- perhaps bounce each incoming message
.SH SYNOPSIS
in
.BR .qmail :
.B |bouncesaying
.I error
[
.I program
[
.I arg ...
]
]
.SH DESCRIPTION
.B bouncesaying
feeds each new mail message to
.I program
with the given arguments.
If
.I program
exits 0,
.B bouncesaying
prints
.I error
and bounces the message.
If
.I program
exits 111,
.B bouncesaying
exits 111,
so delivery will be retried later.
If
.I program
exits anything else
(or does not exist),
.B bouncesaying
exits 0,
so the rest of
.B .qmail
will be processed as usual.
Note that
it is not safe for
.I program
to fork a child that
reads the message in the background.
If
.I program
is not supplied,
.B bouncesaying
always bounces the message:
.EX
|bouncesaying 'This address no longer accepts mail.'
.EE
.B WARNING:
If you create a
.B .qmail
file to enable
.BR bouncesaying ,
make sure to also add a line specifying delivery to your normal mailbox.
.SH "SEE ALSO"
condredirect(1),
except(1),
dot-qmail(5),
qmail-command(8)

41
bouncesaying.c Normal file
View file

@ -0,0 +1,41 @@
#include "fork.h"
#include "strerr.h"
#include "error.h"
#include "wait.h"
#include "sig.h"
#include "exit.h"
#define FATAL "bouncesaying: fatal: "
void main(argc,argv)
int argc;
char **argv;
{
int pid;
int wstat;
if (!argv[1])
strerr_die1x(100,"bouncesaying: usage: bouncesaying error [ program [ arg ... ] ]");
if (argv[2]) {
pid = fork();
if (pid == -1)
strerr_die2sys(111,FATAL,"unable to fork: ");
if (pid == 0) {
execvp(argv[2],argv + 2);
if (error_temp(errno)) _exit(111);
_exit(100);
}
if (wait_pid(&wstat,pid) == -1)
strerr_die2x(111,FATAL,"wait failed");
if (wait_crashed(wstat))
strerr_die2x(111,FATAL,"child crashed");
switch(wait_exitcode(wstat)) {
case 0: break;
case 111: strerr_die2x(111,FATAL,"temporary child error");
default: _exit(0);
}
}
strerr_die1x(100,argv[1]);
}

View file

@ -56,6 +56,8 @@ file to enable
.BR condredirect , .BR condredirect ,
make sure to also add a line specifying delivery to your normal mailbox. make sure to also add a line specifying delivery to your normal mailbox.
.SH "SEE ALSO" .SH "SEE ALSO"
bouncesaying(1),
except(1),
dot-qmail(5), dot-qmail(5),
qmail-command(8), qmail-command(8),
qmail-queue(8) qmail-queue(8)

View file

@ -1,5 +1,6 @@
022 002
These stat bits are not allowed in ~ and ~/.qmail. These stat bits are not allowed in ~ and ~/.qmail. On most systems, the
default umask is 022 or 077, so 022 will work here.
Note that ~ftp, ~www, ~uucp, etc. should be owned by root. Note that ~ftp, ~www, ~uucp, etc. should be owned by root.

12
dns.c
View file

@ -271,12 +271,11 @@ int pref;
int r; int r;
struct ip_mx ix; struct ip_mx ix;
if (sa->len && (sa->s[0] == '['))
{
if (!stralloc_copy(&glue,sa)) return DNS_MEM; if (!stralloc_copy(&glue,sa)) return DNS_MEM;
if (!stralloc_0(&glue)) return DNS_MEM; if (!stralloc_0(&glue)) return DNS_MEM;
if (glue.s[0]) {
ix.pref = 0; ix.pref = 0;
if (!glue.s[ip_scanbracket(glue.s,&ix.ip)]) if (!glue.s[ip_scan(glue.s,&ix.ip)] || !glue.s[ip_scanbracket(glue.s,&ix.ip)])
{ {
if (!ipalloc_append(ia,&ix)) return DNS_MEM; if (!ipalloc_append(ia,&ix)) return DNS_MEM;
return 0; return 0;
@ -316,6 +315,7 @@ unsigned long random;
{ {
int r; int r;
struct mx { stralloc sa; unsigned short p; } *mx; struct mx { stralloc sa; unsigned short p; } *mx;
struct ip_mx ix;
int nummx; int nummx;
int i; int i;
int j; int j;
@ -324,13 +324,11 @@ unsigned long random;
if (!ipalloc_readyplus(ia,0)) return DNS_MEM; if (!ipalloc_readyplus(ia,0)) return DNS_MEM;
ia->len = 0; ia->len = 0;
if (sa->len && (sa->s[0] == '['))
{
struct ip_mx ix;
if (!stralloc_copy(&glue,sa)) return DNS_MEM; if (!stralloc_copy(&glue,sa)) return DNS_MEM;
if (!stralloc_0(&glue)) return DNS_MEM; if (!stralloc_0(&glue)) return DNS_MEM;
if (glue.s[0]) {
ix.pref = 0; ix.pref = 0;
if (!glue.s[ip_scanbracket(glue.s,&ix.ip)]) if (!glue.s[ip_scan(glue.s,&ix.ip)] || !glue.s[ip_scanbracket(glue.s,&ix.ip)])
{ {
if (!ipalloc_append(ia,&ix)) return DNS_MEM; if (!ipalloc_append(ia,&ix)) return DNS_MEM;
return 0; return 0;

33
except.1 Normal file
View file

@ -0,0 +1,33 @@
.TH except 1
.SH NAME
except \- reverse the exit code of a program
.SH SYNOPSIS
.B except
.I program
[
.I arg ...
]
.SH DESCRIPTION
.B except
runs
.I program
with the given arguments.
If
.I program
exits 0,
.B except
exits 100.
If
.I program
exits 111,
.B except
exits 111.
If
.I program
exits anything else,
.B except
exits 0.
.SH "SEE ALSO"
bouncesaying(1),
condredirect(1)

37
except.c Normal file
View file

@ -0,0 +1,37 @@
#include "fork.h"
#include "strerr.h"
#include "wait.h"
#include "error.h"
#include "exit.h"
#define FATAL "except: fatal: "
void main(argc,argv)
int argc;
char **argv;
{
int pid;
int wstat;
if (!argv[1])
strerr_die1x(100,"except: usage: except program [ arg ... ]");
pid = fork();
if (pid == -1)
strerr_die2sys(111,FATAL,"unable to fork: ");
if (pid == 0) {
execvp(argv[1],argv + 1);
if (error_temp(errno)) _exit(111);
_exit(100);
}
if (wait_pid(&wstat,pid) == -1)
strerr_die2x(111,FATAL,"wait failed");
if (wait_crashed(wstat))
strerr_die2x(111,FATAL,"child crashed");
switch(wait_exitcode(wstat)) {
case 0: _exit(100);
case 111: strerr_die2x(111,FATAL,"temporary child error");
default: _exit(0);
}
}

View file

@ -71,7 +71,7 @@ Fortunately, a system administrator can easily obtain a copy of a
931/1413/Ident/TAP server, such as 931/1413/Ident/TAP server, such as
.BR pidentd . .BR pidentd .
Unfortunately, Unfortunately,
many incompetent system administrators fail to do this, some system administrators fail to do this,
and are thus unable to figure out which local user and are thus unable to figure out which local user
was responsible for generating a message. was responsible for generating a message.

252
hier.c Normal file
View file

@ -0,0 +1,252 @@
#include "auto_qmail.h"
#include "auto_split.h"
#include "auto_uids.h"
#include "fmt.h"
#include "fifo.h"
char buf[100 + FMT_ULONG];
void dsplit(base,uid,mode)
char *base; /* must be under 100 bytes */
int uid;
int mode;
{
char *x;
unsigned long i;
d(auto_qmail,base,uid,auto_gidq,mode);
for (i = 0;i < auto_split;++i) {
x = buf;
x += fmt_str(x,base);
x += fmt_str(x,"/");
x += fmt_ulong(x,i);
*x = 0;
d(auto_qmail,buf,uid,auto_gidq,mode);
}
}
void hier()
{
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);
}

147
idedit.c Normal file
View file

@ -0,0 +1,147 @@
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include "readwrite.h"
#include "exit.h"
#include "scan.h"
#include "fmt.h"
#include "strerr.h"
#include "open.h"
#include "seek.h"
#include "fork.h"
#define FATAL "idedit: fatal: "
#define WARNING "idedit: warning: "
int fd;
void byte(pos,value)
char *pos;
unsigned int value;
{
unsigned long u;
unsigned char ch;
if (pos[scan_ulong(pos,&u)]) return;
if (seek_set(fd,(seek_pos) u) == -1)
strerr_die2sys(111,FATAL,"unable to seek: ");
ch = value;
if (write(fd,&ch,1) != 1)
strerr_die2sys(111,FATAL,"unable to write: ");
}
char *args[10];
void run()
{
int pid;
int wstat;
pid = fork();
if (pid == -1)
strerr_die2sys(111,FATAL,"unable to fork: ");
if (pid == 0) {
execv(*args,args);
strerr_die4sys(111,WARNING,"unable to run ",*args,": ");
}
if (wait_pid(&wstat,pid) != pid)
strerr_die2sys(111,FATAL,"waitpid surprise");
}
void u(account,group,home,pos0,pos1,pos2,pos3)
char *account;
char *group;
char *home;
char *pos0;
char *pos1;
char *pos2;
char *pos3;
{
struct passwd *pw;
unsigned int value;
pw = getpwnam(account);
if (!pw && group) {
args[0] = "add-account";
args[1] = account;
args[2] = group;
args[3] = home;
args[4] = 0;
run();
pw = getpwnam(account);
}
if (!pw)
strerr_die3x(111,FATAL,"unable to find uid for ",account);
value = pw->pw_uid;
byte(pos0,value); value >>= 8;
byte(pos1,value); value >>= 8;
byte(pos2,value); value >>= 8;
byte(pos3,value); value >>= 8;
if (value)
strerr_die3x(111,FATAL,"excessively large uid for ",account);
}
void g(group,pos0,pos1,pos2,pos3)
char *group;
char *pos0;
char *pos1;
char *pos2;
char *pos3;
{
struct group *gr;
unsigned int value;
gr = getgrnam(group);
if (!gr) {
args[0] = "add-group";
args[1] = group;
args[2] = 0;
run();
gr = getgrnam(group);
}
if (!gr)
strerr_die3x(111,FATAL,"unable to find gid for ",group);
value = gr->gr_gid;
byte(pos0,value); value >>= 8;
byte(pos1,value); value >>= 8;
byte(pos2,value); value >>= 8;
byte(pos3,value); value >>= 8;
if (value)
strerr_die3x(111,FATAL,"excessively large gid for ",group);
}
void main(argc,argv)
int argc;
char **argv;
{
if (argc < 42) _exit(100);
fd = open_write(argv[1]);
if (fd == -1) strerr_die4sys(111,FATAL,"unable to open ",argv[1],": ");
g("qmail",argv[34],argv[35],argv[36],argv[37]);
g("nofiles",argv[38],argv[39],argv[40],argv[41]);
u("root",(char *) 0,"/",argv[14],argv[15],argv[16],argv[17]);
u("qmaild","nofiles","/var/qmail",argv[6],argv[7],argv[8],argv[9]);
u("qmaill","nofiles","/var/qmail",argv[10],argv[11],argv[12],argv[13]);
u("qmailp","nofiles","/var/qmail",argv[18],argv[19],argv[20],argv[21]);
u("alias","nofiles","/var/qmail/alias",argv[2],argv[3],argv[4],argv[5]);
u("qmailq","qmail","/var/qmail",argv[22],argv[23],argv[24],argv[25]);
u("qmailr","qmail","/var/qmail",argv[26],argv[27],argv[28],argv[29]);
u("qmails","qmail","/var/qmail",argv[30],argv[31],argv[32],argv[33]);
_exit(0);
}

285
install-big.c Normal file
View file

@ -0,0 +1,285 @@
#include "auto_qmail.h"
#include "auto_split.h"
#include "auto_uids.h"
#include "fmt.h"
#include "fifo.h"
char buf[100 + FMT_ULONG];
void dsplit(base,uid,mode)
char *base; /* must be under 100 bytes */
int uid;
int mode;
{
char *x;
unsigned long i;
d(auto_qmail,base,uid,auto_gidq,mode);
for (i = 0;i < auto_split;++i) {
x = buf;
x += fmt_str(x,base);
x += fmt_str(x,"/");
x += fmt_ulong(x,i);
*x = 0;
d(auto_qmail,buf,uid,auto_gidq,mode);
}
}
void hier()
{
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);
c(auto_qmail,"bin","dot-forward",auto_uido,auto_gidq,0755);
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);
d(auto_qmail,"doc/fastforward",auto_uido,auto_gidq,0755);
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);
c(auto_qmail,"doc/fastforward","ALIASES",auto_uido,auto_gidq,0644);
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(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);
}

257
install.c
View file

@ -1,167 +1,164 @@
#include "substdio.h" #include "substdio.h"
#include "stralloc.h" #include "strerr.h"
#include "getln.h" #include "error.h"
#include "open.h"
#include "readwrite.h" #include "readwrite.h"
#include "exit.h" #include "exit.h"
#include "open.h"
#include "error.h"
#include "strerr.h"
#include "byte.h"
#include "fifo.h"
stralloc target = {0}; extern void hier();
char *to;
#define FATAL "install: fatal: " #define FATAL "install: fatal: "
void nomem() { strerr_die2x(111,FATAL,"out of memory"); }
int fdsourcedir = -1;
void h(home,uid,gid,mode)
char *home;
int uid;
int gid;
int mode;
{
if (mkdir(home,0700) == -1)
if (errno != error_exist)
strerr_die4sys(111,FATAL,"unable to mkdir ",home,": ");
if (chown(home,uid,gid) == -1)
strerr_die4sys(111,FATAL,"unable to chown ",home,": ");
if (chmod(home,mode) == -1)
strerr_die4sys(111,FATAL,"unable to chmod ",home,": ");
}
void d(home,subdir,uid,gid,mode)
char *home;
char *subdir;
int uid;
int gid;
int mode;
{
if (chdir(home) == -1)
strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
if (mkdir(subdir,0700) == -1)
if (errno != error_exist)
strerr_die6sys(111,FATAL,"unable to mkdir ",home,"/",subdir,": ");
if (chown(subdir,uid,gid) == -1)
strerr_die6sys(111,FATAL,"unable to chown ",home,"/",subdir,": ");
if (chmod(subdir,mode) == -1)
strerr_die6sys(111,FATAL,"unable to chmod ",home,"/",subdir,": ");
}
void p(home,fifo,uid,gid,mode)
char *home;
char *fifo;
int uid;
int gid;
int mode;
{
if (chdir(home) == -1)
strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
if (fifo_make(fifo,0700) == -1)
if (errno != error_exist)
strerr_die6sys(111,FATAL,"unable to mkfifo ",home,"/",fifo,": ");
if (chown(fifo,uid,gid) == -1)
strerr_die6sys(111,FATAL,"unable to chown ",home,"/",fifo,": ");
if (chmod(fifo,mode) == -1)
strerr_die6sys(111,FATAL,"unable to chmod ",home,"/",fifo,": ");
}
char inbuf[SUBSTDIO_INSIZE]; char inbuf[SUBSTDIO_INSIZE];
char outbuf[SUBSTDIO_OUTSIZE]; char outbuf[SUBSTDIO_OUTSIZE];
substdio ssin; substdio ssin;
substdio ssout; substdio ssout;
void doit(line) void c(home,subdir,file,uid,gid,mode)
stralloc *line; char *home;
char *subdir;
char *file;
int uid;
int gid;
int mode;
{ {
char *x;
unsigned int xlen;
unsigned int i;
char *type;
char *uidstr;
char *gidstr;
char *modestr;
char *mid;
char *name;
unsigned long uid;
unsigned long gid;
unsigned long mode;
int fdin; int fdin;
int fdout; int fdout;
unsigned long zlen;
x = line->s; xlen = line->len; if (fchdir(fdsourcedir) == -1)
strerr_die2sys(111,FATAL,"unable to switch back to source directory: ");
type = x; fdin = open_read(file);
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
uidstr = x;
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
gidstr = x;
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
modestr = x;
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
mid = x;
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
name = x;
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
if (!stralloc_copys(&target,to)) nomem();
if (!stralloc_cats(&target,mid)) nomem();
if (!stralloc_cats(&target,name)) nomem();
if (!stralloc_0(&target)) nomem();
uid = -1; if (*uidstr) scan_ulong(uidstr,&uid);
gid = -1; if (*gidstr) scan_ulong(gidstr,&gid);
scan_8long(modestr,&mode);
switch(*type) {
case 'z':
scan_ulong(type + 1,&zlen);
fdout = open_trunc(target.s);
if (fdout == -1)
strerr_die4sys(111,FATAL,"unable to write ",target.s,": ");
substdio_fdbuf(&ssout,write,fdout,outbuf,sizeof(outbuf));
while (zlen--)
if (substdio_put(&ssout,"",1) == -1)
strerr_die4sys(111,FATAL,"unable to write ",target.s,": ");
if (substdio_flush(&ssout) == -1)
strerr_die4sys(111,FATAL,"unable to write ",target.s,": ");
if (fsync(fdout) == -1)
strerr_die4sys(111,FATAL,"unable to write ",target.s,": ");
close(fdout);
break;
case 'p':
if (fifo_make(target.s,0700) == -1)
if (errno != error_exist)
strerr_die4sys(111,FATAL,"unable to mkfifo ",target.s,": ");
break;
case 'd':
if (mkdir(target.s,0700) == -1)
if (errno != error_exist)
strerr_die4sys(111,FATAL,"unable to mkdir ",target.s,": ");
break;
case 'c':
fdin = open_read(name);
if (fdin == -1) if (fdin == -1)
strerr_die4sys(111,FATAL,"unable to read ",name,": "); strerr_die4sys(111,FATAL,"unable to read ",file,": ");
substdio_fdbuf(&ssin,read,fdin,inbuf,sizeof(inbuf)); substdio_fdbuf(&ssin,read,fdin,inbuf,sizeof inbuf);
fdout = open_trunc(target.s); if (chdir(home) == -1)
strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
if (chdir(subdir) == -1)
strerr_die6sys(111,FATAL,"unable to switch to ",home,"/",subdir,": ");
fdout = open_trunc(file);
if (fdout == -1) if (fdout == -1)
strerr_die4sys(111,FATAL,"unable to write ",target.s,": "); strerr_die6sys(111,FATAL,"unable to write .../",subdir,"/",file,": ");
substdio_fdbuf(&ssout,write,fdout,outbuf,sizeof(outbuf)); substdio_fdbuf(&ssout,write,fdout,outbuf,sizeof outbuf);
switch(substdio_copy(&ssout,&ssin)) { switch(substdio_copy(&ssout,&ssin)) {
case -2: case -2:
strerr_die4sys(111,FATAL,"unable to read ",name,": "); strerr_die4sys(111,FATAL,"unable to read ",file,": ");
case -3: case -3:
strerr_die4sys(111,FATAL,"unable to write ",target.s,": "); strerr_die6sys(111,FATAL,"unable to write .../",subdir,"/",file,": ");
} }
close(fdin); close(fdin);
if (substdio_flush(&ssout) == -1) if (substdio_flush(&ssout) == -1)
strerr_die4sys(111,FATAL,"unable to write ",target.s,": "); strerr_die6sys(111,FATAL,"unable to write .../",subdir,"/",file,": ");
if (fsync(fdout) == -1) if (fsync(fdout) == -1)
strerr_die4sys(111,FATAL,"unable to write ",target.s,": "); strerr_die6sys(111,FATAL,"unable to write .../",subdir,"/",file,": ");
close(fdout); if (close(fdout) == -1) /* NFS silliness */
break; strerr_die6sys(111,FATAL,"unable to write .../",subdir,"/",file,": ");
default: if (chown(file,uid,gid) == -1)
return; strerr_die6sys(111,FATAL,"unable to chown .../",subdir,"/",file,": ");
if (chmod(file,mode) == -1)
strerr_die6sys(111,FATAL,"unable to chmod .../",subdir,"/",file,": ");
} }
if (chown(target.s,uid,gid) == -1) void z(home,file,len,uid,gid,mode)
strerr_die4sys(111,FATAL,"unable to chown ",target.s,": "); char *home;
if (chmod(target.s,mode) == -1) char *file;
strerr_die4sys(111,FATAL,"unable to chmod ",target.s,": "); int len;
} int uid;
int gid;
char buf[256]; int mode;
substdio in = SUBSTDIO_FDBUF(read,0,buf,sizeof(buf));
stralloc line = {0};
void main(argc,argv)
int argc;
char **argv;
{ {
int match; int fdout;
if (chdir(home) == -1)
strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
fdout = open_trunc(file);
if (fdout == -1)
strerr_die6sys(111,FATAL,"unable to write ",home,"/",file,": ");
substdio_fdbuf(&ssout,write,fdout,outbuf,sizeof outbuf);
while (len-- > 0)
if (substdio_put(&ssout,"",1) == -1)
strerr_die6sys(111,FATAL,"unable to write ",home,"/",file,": ");
if (substdio_flush(&ssout) == -1)
strerr_die6sys(111,FATAL,"unable to write ",home,"/",file,": ");
if (fsync(fdout) == -1)
strerr_die6sys(111,FATAL,"unable to write ",home,"/",file,": ");
if (close(fdout) == -1) /* NFS silliness */
strerr_die6sys(111,FATAL,"unable to write ",home,"/",file,": ");
if (chown(file,uid,gid) == -1)
strerr_die6sys(111,FATAL,"unable to chown ",home,"/",file,": ");
if (chmod(file,mode) == -1)
strerr_die6sys(111,FATAL,"unable to chmod ",home,"/",file,": ");
}
void main()
{
fdsourcedir = open_read(".");
if (fdsourcedir == -1)
strerr_die2sys(111,FATAL,"unable to open current directory: ");
umask(077); umask(077);
hier();
to = argv[1];
if (!to) strerr_die2x(100,FATAL,"install: usage: install dir");
for (;;) {
if (getln(&in,&line,&match,'\n') == -1)
strerr_die2sys(111,FATAL,"unable to read input: ");
doit(&line);
if (!match)
_exit(0); _exit(0);
} }
}

View file

@ -1,120 +1,108 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include "substdio.h" #include "strerr.h"
#include "stralloc.h" #include "error.h"
#include "getln.h"
#include "readwrite.h" #include "readwrite.h"
#include "exit.h" #include "exit.h"
#include "error.h"
#include "strerr.h"
#include "byte.h"
stralloc target = {0}; extern void hier();
char *to;
#define WARNING "instcheck: warning: "
#define FATAL "instcheck: fatal: " #define FATAL "instcheck: fatal: "
void nomem() { strerr_die2x(111,FATAL,"out of memory"); } #define WARNING "instcheck: warning: "
void doit(line) void perm(prefix1,prefix2,prefix3,file,type,uid,gid,mode)
stralloc *line; char *prefix1;
char *prefix2;
char *prefix3;
char *file;
int type;
int uid;
int gid;
int mode;
{ {
struct stat st; struct stat st;
char *x;
unsigned int xlen;
unsigned int i;
char *type;
char *uidstr;
char *gidstr;
char *modestr;
char *mid;
char *name;
unsigned long uid;
unsigned long gid;
unsigned long mode;
int ftype;
x = line->s; xlen = line->len; if (stat(file,&st) == -1) {
type = x;
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
uidstr = x;
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
gidstr = x;
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
modestr = x;
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
mid = x;
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
name = x;
i = byte_chr(x,xlen,':'); if (i == xlen) return;
x[i++] = 0; x += i; xlen -= i;
if (!stralloc_copys(&target,to)) nomem();
if (!stralloc_cats(&target,mid)) nomem();
if (!stralloc_cats(&target,name)) nomem();
if (!stralloc_0(&target)) nomem();
uid = -1; if (*uidstr) scan_ulong(uidstr,&uid);
gid = -1; if (*gidstr) scan_ulong(gidstr,&gid);
scan_8long(modestr,&mode);
switch(*type) {
case 'd': ftype = S_IFDIR; break;
case 'c': ftype = S_IFREG; break;
case 'z': ftype = S_IFREG; break;
case 'p': ftype = S_IFIFO; break;
default: return;
}
if (stat(target.s,&st) == -1) {
if (errno == error_noent) if (errno == error_noent)
strerr_warn3(WARNING,target.s," does not exist",0); strerr_warn6(WARNING,prefix1,prefix2,prefix3,file," does not exist",0);
else else
strerr_warn4(WARNING,"unable to stat ",target.s,": ",&strerr_sys); strerr_warn4(WARNING,"unable to stat .../",file,": ",&strerr_sys);
return; return;
} }
if ((uid != -1) && (st.st_uid != uid)) if ((uid != -1) && (st.st_uid != uid))
strerr_warn3(WARNING,target.s," has wrong owner",0); strerr_warn6(WARNING,prefix1,prefix2,prefix3,file," has wrong owner",0);
if ((gid != -1) && (st.st_gid != gid)) if ((gid != -1) && (st.st_gid != gid))
strerr_warn3(WARNING,target.s," has wrong group",0); strerr_warn6(WARNING,prefix1,prefix2,prefix3,file," has wrong group",0);
if ((st.st_mode & 07777) != mode) if ((st.st_mode & 07777) != mode)
strerr_warn3(WARNING,target.s," has wrong permissions",0); strerr_warn6(WARNING,prefix1,prefix2,prefix3,file," has wrong permissions",0);
if ((st.st_mode & S_IFMT) != ftype) if ((st.st_mode & S_IFMT) != type)
strerr_warn3(WARNING,target.s," has wrong type",0); strerr_warn6(WARNING,prefix1,prefix2,prefix3,file," has wrong type",0);
} }
char buf[256]; void h(home,uid,gid,mode)
substdio in = SUBSTDIO_FDBUF(read,0,buf,sizeof(buf)); char *home;
stralloc line = {0}; int uid;
int gid;
void main(argc,argv) int mode;
int argc;
char **argv;
{ {
int match; perm("","","",home,S_IFDIR,uid,gid,mode);
}
umask(077); void d(home,subdir,uid,gid,mode)
char *home;
char *subdir;
int uid;
int gid;
int mode;
{
if (chdir(home) == -1)
strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
perm("",home,"/",subdir,S_IFDIR,uid,gid,mode);
}
to = argv[1]; void p(home,fifo,uid,gid,mode)
if (!to) strerr_die2x(100,FATAL,"instcheck: usage: instcheck dir"); char *home;
char *fifo;
int uid;
int gid;
int mode;
{
if (chdir(home) == -1)
strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
perm("",home,"/",fifo,S_IFIFO,uid,gid,mode);
}
for (;;) { void c(home,subdir,file,uid,gid,mode)
if (getln(&in,&line,&match,'\n') == -1) char *home;
strerr_die2sys(111,FATAL,"unable to read input: "); char *subdir;
doit(&line); char *file;
if (!match) int uid;
int gid;
int mode;
{
if (chdir(home) == -1)
strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
if (chdir(subdir) == -1)
strerr_die6sys(111,FATAL,"unable to switch to ",home,"/",subdir,": ");
perm(".../",subdir,"/",file,S_IFREG,uid,gid,mode);
}
void z(home,file,len,uid,gid,mode)
char *home;
char *file;
int len;
int uid;
int gid;
int mode;
{
if (chdir(home) == -1)
strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
perm("",home,"/",file,S_IFREG,uid,gid,mode);
}
void main()
{
hier();
_exit(0); _exit(0);
} }
}

View file

@ -11,7 +11,8 @@ The main function of
.B qmail-inject .B qmail-inject
is to make sure that each outgoing message has an appropriate header. is to make sure that each outgoing message has an appropriate header.
For more detailed information, see RFC 822 and RFC 1123. For more detailed information, see
.BR http://pobox.com/~djb/proto/immhf.html .
.SH "MESSAGE STRUCTURE" .SH "MESSAGE STRUCTURE"
A message contains a series of A message contains a series of
.I header fields\fR, .I header fields\fR,

View file

@ -1,288 +0,0 @@
#include "subfd.h"
#include "substdio.h"
#include "auto_split.h"
#include "auto_uids.h"
#include "fmt.h"
char strnum[FMT_ULONG];
void uidgid(uid)
int uid;
{
substdio_put(subfdout,strnum,fmt_ulong(strnum,(unsigned long) uid));
substdio_puts(subfdout,":");
substdio_put(subfdout,strnum,fmt_ulong(strnum,(unsigned long) auto_gidq));
substdio_puts(subfdout,":");
}
void copy(uid,mode,sub,fn)
int uid;
char *mode;
char *sub;
char *fn;
{
substdio_puts(subfdout,"c:");
uidgid(uid);
substdio_puts(subfdout,mode);
substdio_puts(subfdout,":");
substdio_puts(subfdout,sub);
substdio_puts(subfdout,":");
substdio_puts(subfdout,fn);
substdio_puts(subfdout,":\n");
}
void dir(uid,mode,fn)
int uid;
char *mode;
char *fn;
{
substdio_puts(subfdout,"d:");
uidgid(uid);
substdio_puts(subfdout,mode);
substdio_puts(subfdout,":");
substdio_puts(subfdout,fn);
substdio_puts(subfdout,"::\n");
}
void dirsplit(uid,mode,fn)
int uid;
char *mode;
char *fn;
{
unsigned long i;
dir(uid,mode,fn);
for (i = 0;i < auto_split;++i) {
substdio_puts(subfdout,"d:");
uidgid(uid);
substdio_puts(subfdout,mode);
substdio_puts(subfdout,":");
substdio_puts(subfdout,fn);
substdio_puts(subfdout,":/");
substdio_put(subfdout,strnum,fmt_ulong(strnum,i));
substdio_puts(subfdout,":\n");
}
}
void main()
{
dir(auto_uido,"755","");
dir(auto_uido,"755","/control");
dir(auto_uido,"755","/users");
dir(auto_uido,"755","/bin");
dir(auto_uido,"755","/man");
dir(auto_uido,"755","/man/cat1");
dir(auto_uido,"755","/man/cat5");
dir(auto_uido,"755","/man/cat7");
dir(auto_uido,"755","/man/cat8");
dir(auto_uido,"755","/man/man1");
dir(auto_uido,"755","/man/man5");
dir(auto_uido,"755","/man/man7");
dir(auto_uido,"755","/man/man8");
dir(auto_uido,"755","/doc");
dir(auto_uido,"755","/boot");
copy(auto_uido,"755","/boot/","home");
copy(auto_uido,"755","/boot/","home+df");
copy(auto_uido,"755","/boot/","proc");
copy(auto_uido,"755","/boot/","proc+df");
copy(auto_uido,"755","/boot/","binm1");
copy(auto_uido,"755","/boot/","binm1+df");
copy(auto_uido,"755","/boot/","binm2");
copy(auto_uido,"755","/boot/","binm2+df");
copy(auto_uido,"755","/boot/","binm3");
copy(auto_uido,"755","/boot/","binm3+df");
copy(auto_uido,"644","/doc/","FAQ");
copy(auto_uido,"644","/doc/","UPGRADE");
copy(auto_uido,"644","/doc/","SENDMAIL");
copy(auto_uido,"644","/doc/","INSTALL");
copy(auto_uido,"644","/doc/","INSTALL.alias");
copy(auto_uido,"644","/doc/","INSTALL.boot");
copy(auto_uido,"644","/doc/","INSTALL.ctl");
copy(auto_uido,"644","/doc/","INSTALL.ids");
copy(auto_uido,"644","/doc/","INSTALL.maildir");
copy(auto_uido,"644","/doc/","INSTALL.mbox");
copy(auto_uido,"644","/doc/","INSTALL.vsm");
copy(auto_uido,"644","/doc/","PIC.local2alias");
copy(auto_uido,"644","/doc/","PIC.local2ext");
copy(auto_uido,"644","/doc/","PIC.local2local");
copy(auto_uido,"644","/doc/","PIC.local2rem");
copy(auto_uido,"644","/doc/","PIC.local2virt");
copy(auto_uido,"644","/doc/","PIC.nullclient");
copy(auto_uido,"644","/doc/","PIC.relaybad");
copy(auto_uido,"644","/doc/","PIC.relaygood");
copy(auto_uido,"644","/doc/","PIC.rem2local");
dir(auto_uida,"2755","/alias");
dir(auto_uidq,"750","/queue");
dir(auto_uidq,"700","/queue/pid");
dir(auto_uidq,"700","/queue/intd");
dir(auto_uidq,"750","/queue/todo");
dir(auto_uidq,"750","/queue/lock");
dir(auto_uids,"700","/queue/bounce");
substdio_puts(subfdout,"z0:");
uidgid(auto_uids);
substdio_puts(subfdout,"600:/queue/lock/:sendmutex:\n");
substdio_puts(subfdout,"z1024:");
uidgid(auto_uidr);
substdio_puts(subfdout,"644:/queue/lock/:tcpto:\n");
substdio_puts(subfdout,"p:");
uidgid(auto_uids);
substdio_puts(subfdout,"622:/queue/lock/:trigger:\n");
dirsplit(auto_uidq,"750","/queue/mess");
dirsplit(auto_uids,"700","/queue/info");
dirsplit(auto_uids,"700","/queue/local");
dirsplit(auto_uids,"700","/queue/remote");
copy(auto_uidq,"4711","/bin/","qmail-queue");
copy(auto_uido,"700","/bin/","qmail-lspawn");
copy(auto_uido,"700","/bin/","qmail-start");
copy(auto_uido,"711","/bin/","qmail-getpw");
copy(auto_uido,"711","/bin/","qmail-local");
copy(auto_uido,"711","/bin/","qmail-remote");
copy(auto_uido,"711","/bin/","qmail-rspawn");
copy(auto_uido,"711","/bin/","qmail-clean");
copy(auto_uido,"711","/bin/","qmail-send");
copy(auto_uido,"711","/bin/","splogger");
copy(auto_uido,"700","/bin/","qmail-newu");
copy(auto_uido,"700","/bin/","qmail-newmrh");
copy(auto_uido,"711","/bin/","qmail-pw2u");
copy(auto_uido,"755","/bin/","qmail-inject");
copy(auto_uido,"755","/bin/","predate");
copy(auto_uido,"755","/bin/","datemail");
copy(auto_uido,"755","/bin/","mailsubj");
copy(auto_uido,"755","/bin/","qmail-showctl");
copy(auto_uido,"755","/bin/","qmail-qread");
copy(auto_uido,"755","/bin/","qmail-qstat");
copy(auto_uido,"755","/bin/","qmail-tcpto");
copy(auto_uido,"755","/bin/","qmail-tcpok");
copy(auto_uido,"755","/bin/","qmail-pop3d");
copy(auto_uido,"711","/bin/","qmail-popup");
copy(auto_uido,"755","/bin/","qmail-qmqpc");
copy(auto_uido,"755","/bin/","qmail-qmqpd");
copy(auto_uido,"755","/bin/","qmail-qmtpd");
copy(auto_uido,"755","/bin/","qmail-smtpd");
copy(auto_uido,"755","/bin/","sendmail");
copy(auto_uido,"755","/bin/","tcp-env");
copy(auto_uido,"755","/bin/","qreceipt");
copy(auto_uido,"755","/bin/","qsmhook");
copy(auto_uido,"755","/bin/","qbiff");
copy(auto_uido,"755","/bin/","forward");
copy(auto_uido,"755","/bin/","preline");
copy(auto_uido,"755","/bin/","condredirect");
copy(auto_uido,"755","/bin/","maildirmake");
copy(auto_uido,"755","/bin/","maildir2mbox");
copy(auto_uido,"755","/bin/","maildirwatch");
copy(auto_uido,"755","/bin/","qail");
copy(auto_uido,"755","/bin/","elq");
copy(auto_uido,"755","/bin/","pinq");
copy(auto_uido,"644","/man/man5/","addresses.5");
copy(auto_uido,"644","/man/cat5/","addresses.0");
copy(auto_uido,"644","/man/man5/","envelopes.5");
copy(auto_uido,"644","/man/cat5/","envelopes.0");
copy(auto_uido,"644","/man/man5/","maildir.5");
copy(auto_uido,"644","/man/cat5/","maildir.0");
copy(auto_uido,"644","/man/man5/","mbox.5");
copy(auto_uido,"644","/man/cat5/","mbox.0");
copy(auto_uido,"644","/man/man5/","dot-qmail.5");
copy(auto_uido,"644","/man/cat5/","dot-qmail.0");
copy(auto_uido,"644","/man/man5/","qmail-control.5");
copy(auto_uido,"644","/man/cat5/","qmail-control.0");
copy(auto_uido,"644","/man/man5/","qmail-header.5");
copy(auto_uido,"644","/man/cat5/","qmail-header.0");
copy(auto_uido,"644","/man/man5/","qmail-log.5");
copy(auto_uido,"644","/man/cat5/","qmail-log.0");
copy(auto_uido,"644","/man/man5/","qmail-users.5");
copy(auto_uido,"644","/man/cat5/","qmail-users.0");
copy(auto_uido,"644","/man/man5/","tcp-environ.5");
copy(auto_uido,"644","/man/cat5/","tcp-environ.0");
copy(auto_uido,"644","/man/man7/","forgeries.7");
copy(auto_uido,"644","/man/cat7/","forgeries.0");
copy(auto_uido,"644","/man/man7/","qmail-limits.7");
copy(auto_uido,"644","/man/cat7/","qmail-limits.0");
copy(auto_uido,"644","/man/man7/","qmail.7");
copy(auto_uido,"644","/man/cat7/","qmail.0");
copy(auto_uido,"644","/man/man1/","forward.1");
copy(auto_uido,"644","/man/cat1/","forward.0");
copy(auto_uido,"644","/man/man1/","condredirect.1");
copy(auto_uido,"644","/man/cat1/","condredirect.0");
copy(auto_uido,"644","/man/man1/","maildirmake.1");
copy(auto_uido,"644","/man/cat1/","maildirmake.0");
copy(auto_uido,"644","/man/man1/","maildir2mbox.1");
copy(auto_uido,"644","/man/cat1/","maildir2mbox.0");
copy(auto_uido,"644","/man/man1/","maildirwatch.1");
copy(auto_uido,"644","/man/cat1/","maildirwatch.0");
copy(auto_uido,"644","/man/man1/","mailsubj.1");
copy(auto_uido,"644","/man/cat1/","mailsubj.0");
copy(auto_uido,"644","/man/man1/","qreceipt.1");
copy(auto_uido,"644","/man/cat1/","qreceipt.0");
copy(auto_uido,"644","/man/man1/","qbiff.1");
copy(auto_uido,"644","/man/cat1/","qbiff.0");
copy(auto_uido,"644","/man/man1/","preline.1");
copy(auto_uido,"644","/man/cat1/","preline.0");
copy(auto_uido,"644","/man/man1/","tcp-env.1");
copy(auto_uido,"644","/man/cat1/","tcp-env.0");
copy(auto_uido,"644","/man/man8/","qmail-local.8");
copy(auto_uido,"644","/man/cat8/","qmail-local.0");
copy(auto_uido,"644","/man/man8/","qmail-lspawn.8");
copy(auto_uido,"644","/man/cat8/","qmail-lspawn.0");
copy(auto_uido,"644","/man/man8/","qmail-getpw.8");
copy(auto_uido,"644","/man/cat8/","qmail-getpw.0");
copy(auto_uido,"644","/man/man8/","qmail-remote.8");
copy(auto_uido,"644","/man/cat8/","qmail-remote.0");
copy(auto_uido,"644","/man/man8/","qmail-rspawn.8");
copy(auto_uido,"644","/man/cat8/","qmail-rspawn.0");
copy(auto_uido,"644","/man/man8/","qmail-clean.8");
copy(auto_uido,"644","/man/cat8/","qmail-clean.0");
copy(auto_uido,"644","/man/man8/","qmail-send.8");
copy(auto_uido,"644","/man/cat8/","qmail-send.0");
copy(auto_uido,"644","/man/man8/","qmail-start.8");
copy(auto_uido,"644","/man/cat8/","qmail-start.0");
copy(auto_uido,"644","/man/man8/","splogger.8");
copy(auto_uido,"644","/man/cat8/","splogger.0");
copy(auto_uido,"644","/man/man8/","qmail-queue.8");
copy(auto_uido,"644","/man/cat8/","qmail-queue.0");
copy(auto_uido,"644","/man/man8/","qmail-inject.8");
copy(auto_uido,"644","/man/cat8/","qmail-inject.0");
copy(auto_uido,"644","/man/man8/","qmail-showctl.8");
copy(auto_uido,"644","/man/cat8/","qmail-showctl.0");
copy(auto_uido,"644","/man/man8/","qmail-newmrh.8");
copy(auto_uido,"644","/man/cat8/","qmail-newmrh.0");
copy(auto_uido,"644","/man/man8/","qmail-newu.8");
copy(auto_uido,"644","/man/cat8/","qmail-newu.0");
copy(auto_uido,"644","/man/man8/","qmail-pw2u.8");
copy(auto_uido,"644","/man/cat8/","qmail-pw2u.0");
copy(auto_uido,"644","/man/man8/","qmail-qread.8");
copy(auto_uido,"644","/man/cat8/","qmail-qread.0");
copy(auto_uido,"644","/man/man8/","qmail-qstat.8");
copy(auto_uido,"644","/man/cat8/","qmail-qstat.0");
copy(auto_uido,"644","/man/man8/","qmail-tcpok.8");
copy(auto_uido,"644","/man/cat8/","qmail-tcpok.0");
copy(auto_uido,"644","/man/man8/","qmail-tcpto.8");
copy(auto_uido,"644","/man/cat8/","qmail-tcpto.0");
copy(auto_uido,"644","/man/man8/","qmail-pop3d.8");
copy(auto_uido,"644","/man/cat8/","qmail-pop3d.0");
copy(auto_uido,"644","/man/man8/","qmail-popup.8");
copy(auto_uido,"644","/man/cat8/","qmail-popup.0");
copy(auto_uido,"644","/man/man8/","qmail-qmqpc.8");
copy(auto_uido,"644","/man/cat8/","qmail-qmqpc.0");
copy(auto_uido,"644","/man/man8/","qmail-qmqpd.8");
copy(auto_uido,"644","/man/cat8/","qmail-qmqpd.0");
copy(auto_uido,"644","/man/man8/","qmail-qmtpd.8");
copy(auto_uido,"644","/man/cat8/","qmail-qmtpd.0");
copy(auto_uido,"644","/man/man8/","qmail-smtpd.8");
copy(auto_uido,"644","/man/cat8/","qmail-smtpd.0");
copy(auto_uido,"644","/man/man8/","qmail-command.8");
copy(auto_uido,"644","/man/cat8/","qmail-command.0");
substdio_flush(subfdout);
_exit(0);
}

View file

@ -16,12 +16,6 @@ installation,
.B qmail-queue .B qmail-queue
is replaced with a symbolic link to is replaced with a symbolic link to
.BR qmail-qmqpc . .BR qmail-qmqpc .
.B qmail-qmqpc
is currently experimental;
use it at your own risk.
It will be fully supported in the next release of
.BR qmail .
.SH "CONTROL FILES" .SH "CONTROL FILES"
.TP 5 .TP 5
.I qmqpservers .I qmqpservers

View file

@ -1,5 +1,3 @@
/* EXPERIMENTAL! Use at your own risk. */
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>

View file

@ -17,12 +17,6 @@ see
.B qmail-qmqpd .B qmail-qmqpd
will relay messages to any destination. will relay messages to any destination.
It should be invoked only for connections from preauthorized users. It should be invoked only for connections from preauthorized users.
.B qmail-qmqpd
is currently experimental;
use it at your own risk.
It will be fully supported in the next release of
.BR qmail .
.SH "SEE ALSO" .SH "SEE ALSO"
tcp-env(1), tcp-env(1),
tcpserver(1), tcpserver(1),

View file

@ -1,5 +1,3 @@
/* EXPERIMENTAL! Use at your own risk. */
#include "auto_qmail.h" #include "auto_qmail.h"
#include "qmail.h" #include "qmail.h"
#include "received.h" #include "received.h"
@ -167,9 +165,7 @@ main()
if (!flagok) if (!flagok)
result = "Dsorry, I can't accept addresses like that (#5.1.3)"; result = "Dsorry, I can't accept addresses like that (#5.1.3)";
fmt_ulong(strnum,str_len(result)); substdio_put(&ssout,strnum,fmt_ulong(strnum,(unsigned long) str_len(result)));
substdio_puts(&ssout,strnum);
substdio_puts(&ssout,":"); substdio_puts(&ssout,":");
substdio_puts(&ssout,result); substdio_puts(&ssout,result);
substdio_puts(&ssout,","); substdio_puts(&ssout,",");

View file

@ -9,8 +9,12 @@
#include "constmap.h" #include "constmap.h"
#include "stralloc.h" #include "stralloc.h"
#include "direntry.h" #include "direntry.h"
#include "auto_qmail.h"
#include "auto_uids.h" #include "auto_uids.h"
#include "auto_qmail.h"
#include "auto_break.h"
#include "auto_patrn.h"
#include "auto_spawn.h"
#include "auto_split.h"
stralloc me = {0}; stralloc me = {0};
int meok; int meok;
@ -139,11 +143,27 @@ void main()
struct stat stmrh; struct stat stmrh;
struct stat stmrhcdb; struct stat stmrhcdb;
substdio_puts(subfdout,"The qmail control files are stored in "); substdio_puts(subfdout,"qmail home directory: ");
substdio_puts(subfdout,auto_qmail); substdio_puts(subfdout,auto_qmail);
substdio_puts(subfdout,"/control.\n"); substdio_puts(subfdout,".\n");
substdio_puts(subfdout,"The uids and gids are "); substdio_puts(subfdout,"user-ext delimiter: ");
substdio_puts(subfdout,auto_break);
substdio_puts(subfdout,".\n");
substdio_puts(subfdout,"paternalism (in decimal): ");
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_patrn));
substdio_puts(subfdout,".\n");
substdio_puts(subfdout,"silent concurrency limit: ");
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_spawn));
substdio_puts(subfdout,".\n");
substdio_puts(subfdout,"subdirectory split: ");
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_split));
substdio_puts(subfdout,".\n");
substdio_puts(subfdout,"user ids: ");
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uida)); substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uida));
substdio_puts(subfdout,", "); substdio_puts(subfdout,", ");
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uidd)); substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uidd));
@ -159,7 +179,9 @@ void main()
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uidr)); substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uidr));
substdio_puts(subfdout,", "); substdio_puts(subfdout,", ");
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uids)); substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uids));
substdio_puts(subfdout,", "); substdio_puts(subfdout,".\n");
substdio_puts(subfdout,"group ids: ");
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_gidn)); substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_gidn));
substdio_puts(subfdout,", "); substdio_puts(subfdout,", ");
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_gidq)); substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_gidq));

View file

@ -149,12 +149,14 @@ char *arg;
terminator = '>'; terminator = '>';
i = str_chr(arg,'<'); i = str_chr(arg,'<');
if (!arg[i]) { /* partner should go read rfc 821 */ if (arg[i])
terminator = ' ';
i = str_chr(arg,':');
if (!arg[i]) return 0;
}
arg += i + 1; arg += i + 1;
else { /* partner should go read rfc 821 */
terminator = ' ';
arg += str_chr(arg,':');
if (*arg == ':') ++arg;
while (*arg == ' ') ++arg;
}
/* strip source route */ /* strip source route */
if (*arg == '@') while (*arg) if (*arg++ == ':') break; if (*arg == '@') while (*arg) if (*arg++ == ':') break;
@ -209,7 +211,7 @@ int bmfcheck()
int addrallowed() int addrallowed()
{ {
int r; int r;
r = rcpthosts(addr.s + 1,addr.len - 2); r = rcpthosts(addr.s,str_len(addr.s));
if (r == -1) die_control(); if (r == -1) die_control();
return r; return r;
} }
@ -221,6 +223,11 @@ stralloc mailfrom = {0};
stralloc rcptto = {0}; stralloc rcptto = {0};
void smtp_helo(arg) char *arg; void smtp_helo(arg) char *arg;
{
smtp_greet("250 "); out("\r\n");
seenmail = 0; dohelo(arg);
}
void smtp_ehlo(arg) char *arg;
{ {
smtp_greet("250-"); out("\r\n250-PIPELINING\r\n250 8BITMIME\r\n"); smtp_greet("250-"); out("\r\n250-PIPELINING\r\n250 8BITMIME\r\n");
seenmail = 0; dohelo(arg); seenmail = 0; dohelo(arg);
@ -393,7 +400,7 @@ struct commands smtpcommands[] = {
, { "data", smtp_data, flush } , { "data", smtp_data, flush }
, { "quit", smtp_quit, flush } , { "quit", smtp_quit, flush }
, { "helo", smtp_helo, flush } , { "helo", smtp_helo, flush }
, { "ehlo", smtp_helo, flush } , { "ehlo", smtp_ehlo, flush }
, { "rset", smtp_rset, 0 } , { "rset", smtp_rset, 0 }
, { "help", smtp_help, flush } , { "help", smtp_help, flush }
, { "noop", err_noop, flush } , { "noop", err_noop, flush }

View file

@ -14,7 +14,8 @@ file include
.BR qbiff (1), .BR qbiff (1),
.BR qreceipt (1), .BR qreceipt (1),
.BR forward (1), .BR forward (1),
and (for advanced users) .BR bouncesaying (1),
and
.BR condredirect (1). .BR condredirect (1).
Other helpful commands include Other helpful commands include
.BR maildirmake (1), .BR maildirmake (1),
@ -55,7 +56,7 @@ and
.BR qmail-pop3d (8). .BR qmail-pop3d (8).
This documentation describes version This documentation describes version
1.02 1.03
of of
.BR qmail . .BR qmail .
See See