.Ch "Locking in C News"
.Ix lock
.LP
Several parts of
C News
need some way of locking parts of the news
subsystem against concurrent execution.
Various system-specific locking system calls exist,
but none of them
is truly portable,
and most of them provide far more functionality than
we need.
.LP
C News
.Ix link
locking uses the \fIlink\fR(2) system call and pre-agreed names.
\fILink\fR has the necessary characteristic for safe locking:
it is an atomic test-and-set operation.
Furthermore,
it exists in all Unixes.
.LP
.Ix lock names
All locks are created in the NEWSCTL directory
(see \fIConfiguration Mechanisms in C News\fR for where this directory
is to be found and how programs can determine this)
and have names starting with `LOCK'.
To acquire a lock,
.Ix lock acquiring
.Ix LOCK
.Ix files LOCK
first create a temporary file in NEWSCTL with a name
of the form `L.\fIn\fR', where \fIn\fR is your process id.
You are urged to also write your process id,
in decimal ASCII,
into this file.
Then attempt to link the temporary file to `LOCK\fIx\fR',
where \fIx\fR is chosen based
on what sort of locking you wish to do.
Existing lock names are:
.TS
center;
ll.
LOCK	relaynews, modifications to control files
LOCKinput	input subsystem processing spooled input
LOCKbatch	batcher preparing batches
LOCKexpire	expire expiring articles
.TE
If the link fails,
sleep and try again.
If it succeeds,
proceed.
The temporary file may be removed then or at the same time as the lock
is removed.
Programs are expected to make a determined effort to remove lock files
when they terminate,
normally or as a result of signals.
.LP
.Ix Unix "System V"
.Ix "System V" breakage
.Ix ln
Shell programs have an additional problem in that System V has broken
\fIln\fR(1) so that it removes a pre-existing destination file.
C News
therefore provides a pure,
simple locking program under
the name NEWSBIN/newslock
.Ix newslock
(if the recommendations in
\fIDirectory Layout and PATH in C News\fR are followed,
this will
automatically be in the search path of shell programs).
Usage is `newslock\ tempfile\ lockfile';
exit status is 0 for success,
1 for failure,
2 for wrong number of arguments.
No messages are printed for normal failure,
so no redirection of output is needed.
.LP
A suitable locking procedure for a shell file using the standard
configuration facilities is:
.DS
.ft B
lock="$NEWSCTL/LOCKxxx"		# modify name as appropriate
ltemp="$NEWSCTL/L.$$"
echo $$ >$ltemp
trap "rm \-f $ltemp ; exit 0" 0 1 2 15
while true
do
	if newslock $ltemp $lock
	then
		trap "rm \-f $ltemp $lock ; exit 0" 0 1 2 15
		break
	fi
	sleep 30
done
.ft	
.DE
A template of this form can be found in the file \fInewslock.sh\fR.
.LP
Although there are various thorny questions associated with breaking
locks by dead programs,
.Ix lock clearing
reboot is a time when surviving locks are
definitely invalid.
(Although there are problems even here if a networked group of systems
are not rebooted as a unit.)
For this and other reasons,
a system running C News should execute
.Ix newsboot
.Ix /etc/rc
NEWSCTL/bin/newsboot at reboot time (e.g. from \fI/etc/rc\fR).
