lockmail — create mail lock files
lockmail
[-r] [-t timeout
] {lockfile
} {program
} [argument...]
lockmail is a helper utility for working with mailbox files. Mailbox files must be locked to prevent other applications from modifying the mailbox at the same time. Different system use different locking conventions. lockmail uses two of the most common locking mechanisms in use, which should work reliably on most systems.
lockfile
is the pathname to an existing mailbox
file.
By default, lockmail tries to lock the mailbox every
five seconds (if the mailbox is already locked), and will give up after
three minutes.
After the mailbox is successfully locked, lockmail runs
program
as a child process, with any optional
argument
s.
When program
terminates, lockmail
removes the mailbox lock, and terminates itself.
If a regular lock fails, try a read-only lock. Use this option to lock mailbox files in a read-only directory.
timeout
If the lock attempt fails, try again for up to
timeout
seconds.
The actual timeout is rounded up to the next five second interval
(a lock attempt is tried every five seconds).
This section briefly describes the locking mechanism used by lockmail. lockmail uses three different locking conventions in order to maximize compatibility with other mail software: C-Client folder locks, dot-locks, and file locks.
Mail software based on the C-Client
library creates
lock files named
/tmp/.
.
Here, dddddd
.iiiiii
dddddd
and iiiiii
are the device number and the inode number of the mailbox file
(the st_dev
and st_ino
fields in the inode), in hexadecimal.
If the process ID saved in the C-Client folder lock file is not valid,
lockmail concludes that it's a stale lock file, and
will remove it.
A race condition exists where a C-Client
process is
killed after it creates a lock file, but before saving its process ID in the
lock file.
The race window is very small, but it exists.
The C-Client
library does not appear to ever clear out
the lock file.
lockmail attempts to resolve this race condition by deleting zero-length lock files that are at least five minutes old.
lockmail
also creates, and honors dot-lock files.
Dot-lock files are first created as temporary files, then linked to
.
The link operation fails if the dot-lock file already exists.
lockmail
uses an enhanced method of dot-locking, where its process ID, and the name
of the server where lockmail is running is also saved
in its dot-lock file.
If the operation fails due to an existing dot-lock file that was created
by another lockmail process on the same server, and the
process ID no longer exists, this stale dot-lock file is removed immediately.
In all other situations a dot-lock file older than five minutes is considered
stale, and removed.
lockfile
.lock
A failure to create a dot-lock file is silently ignored if the reason for
the failure is because
lockmail
does not have the write permission in the dot-lock file's directory.
The incoming mail spool directory (usually
/var/mail
)
typically does not have global write permissions, so the attempt to
create the dot-lock file in the spool directory will fail, and
lockmail
will be content with using file-locking only.
The final locking mechanism
lockmail
uses is the operating system's file locking facility.
If
lockmail
fails to obtain all three locks,
lockmail
will sleep for five seconds and try again.
The only exception is a failure to create a dot-lock because of no write
access to the dot-lock file's directory, which is ignored.
If
lockmail
still fails to obtain all required locks in the amount of time specified
by the -t
option (or its default value),
lockmail will terminate with the
EX_TEMPFAIL
exit code.
lockmail
runs program
after obtaining the last file
lock, waits until program
terminates, and
releases all locks.
program
must terminate before any of the locks
obtained by lockmail expire, and are considered stale.
lockmail will then terminate with the same exit code
as program
.